下一個代碼給我結果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.999999999999998,但正確答案是6精密二郎
Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5))
Area = 1/2 * 4 * 5 * math:sin(Alpha)
是否有可能得到6?
您遇到了如此普遍,它有自己的網站,What Every Programmer Should Know About Floating-Point Arithmetic問題。這個問題是由於浮點算法在市場上幾乎所有支持FP算法的CPU都有效;這不是Erlang特有的。
如果經常浮點運算不給你你需要的精度和準確度,你可以使用高精度計算庫而不是內置的算法。也許最知名的這樣的庫是GMP,但是你必須將它包裝在NIFs中才能在Erlang中使用它。
有at least one pure-Erlang alternative,但我與它沒有經驗,所以我不能親自背書。
計算是使用你的硬件標準的浮點運算來完成。有時會出現舍入錯誤。
你真的需要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
你不能保證使用浮點運算時,獲得精確的結果。這個話題已經被很多很多次覆蓋了。 – Nayuki