2013-03-20 63 views
0

我試圖解決一個斐波納契問題,並陷入舍入問題。紅寶石 - 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.你期望結果是什麼,爲什麼? – 2013-03-28 04:12:19

回答

1

這樣做開方不會爲這麼大的值正常工作,因爲開方返回一個浮點數和其精度不會在這裏就夠了。我會建議你實現你自己的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的平方根(簡單地提高爲0.5供電),但我更喜歡上述方法,因爲它不涉及任何雙重計算。

+0

我試過將它提高到0.5的功率,但有同樣的問題。我會試試這個。 – eadon 2013-03-20 16:37:16

+0

這確實有效 - 儘管我認爲我的纖維方程可能是錯誤的。謝謝。 – eadon 2013-03-20 17:08:57