2011-10-05 110 views
6

下一個代碼給我結果5.999999999999998,但正確答案是6精密二郎

Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5)) 
Area = 1/2 * 4 * 5 * math:sin(Alpha) 

是否有可能得到6?

+5

你不能保證使用浮點運算時,獲得精確的結果。這個話題已經被很多很多次覆蓋了。 – Nayuki

回答

23

您遇到了如此普遍,它有自己的網站,What Every Programmer Should Know About Floating-Point Arithmetic問題。這個問題是由於浮點算法在市場上幾乎所有支持FP算法的CPU都有效;這不是Erlang特有的。

如果經常浮點運算不給你你需要的精度和準確度,你可以使用高精度計算庫而不是內置的算法。也許最知名的這樣的庫是GMP,但是你必須將它包裝在NIFs中才能在Erlang中使用它。

at least one pure-Erlang alternative,但我與它沒有經驗,所以我不能親自背書。

+0

對於任何正在進行浮點運算的人來說,這絕對是必讀的。 – rvirding

+0

鏈路 – Yola

+0

@WarrenYoung十分感謝謝謝你的信息,我沒有搜查,我foun這一點:https://github.com/tim/erlang-decimal但我不知道,如果是在積極發展,但部分人們有變化和新功能的分叉。 – JHG

8

計算是使用你的硬件標準的浮點運算來完成。有時會出現舍入錯誤。

你真的需要15位精度?

爲了獲得更「精確」的數值可以有多種選擇:

> round(Area). % Will round to integer 
6 

或者你可以四捨五入到一些精密

round(Area * 10000000)/10000000. 
6.0 

如果目的是打印的價值,然後打印浮點數的默認輸出會降低精度。

io:format("~f~n", [Area]). 
6.000000 
ok 

或與特定精度

io:format("~.14f~n", [Area]). 
6.00000000000000 
ok 

HTH