2011-10-05 105 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