2013-03-20 2 views
0

Я пытаюсь решить проблему Фибоначчи и споткнуться о проблемах округления.Ruby - Sqrt на очень большом Целочисленная причина Проблемы округления

Если i = 8670007398507948658051921, то fib1 = 19386725908489880000000000.0.

Мой код ниже - спасибо за любую помощь.

def is_fibonacci?(i) 

    fib1 = Math.sqrt(5*(i**2)+4) 
    fib2 = Math.sqrt(5*(i**2)-4) 

    fib1 == fib1.round || fib2 == fib2.round ? true : false 

end 
+0

Можете ли вы стать более понятным, что происходит? В частности, 1. Какую команду вы используете с помощью этой функции? 2. Каков результат? и 3. Что вы ожидали от результата и почему? –

ответ

1

Doing SQRT как это не будет работать для таких больших значений, поскольку SQRT возвращает Float и его точность не будет здесь достаточно. Я бы посоветовал вам реализовать свою собственную функцию sqrt. Есть несколько алгоритмов вне там предлагая, как сделать это, но я лично, что с помощью двоичного поиска для вычисления обратного для функции является самым простым:

def sqrt a 
    begv = 1 
    endv = a 
    while endv > begv + 1 
    mid = (endv + begv)/2 
    if mid ** 2 <= a 
     begv = mid 
    else 
     endv = mid 
    end 
    end 
    return begv 
end 

В качестве альтернативы вы можете попробовать использовать BigDecimal для SQRT (просто поднять к власти 0.5), но мне нравится выше метод лучше, поскольку он не предполагает каких-либо двойных вычислений.

+0

Я попытался поднять его до уровня 0.5, но имеет ту же проблему. Я попробую это. – eadon

+0

Это действительно работает - хотя я думаю, что мое уравнение может быть неправильным. Спасибо. – eadon