Erlang的精确度

Yol*_*ola 5 floating-point precision erlang

下一个代码在结果中给了我5.999999999999998,但正确答案是6.

Alpha = math:acos((4*4 + 5*5 - 3*3) / (2*4*5))
Area = 1/2 * 4 * 5 * math:sin(Alpha)
Run Code Online (Sandbox Code Playgroud)

有可能得到6?

War*_*ung 23

你遇到了一个如此常见的问题,它有自己的网站,每个程序员应该知道什么关于浮点运算.问题是由于浮点运算在市场上支持FP算术的几乎所有CPU中的工作原理; 它不是Erlang特有的.

如果经常浮点运算不给你你需要的精度和准确度,你可以使用高精度计算库而不是内置的算法.也许最知名的这样的库是GMP,但你必须将其包装在NIF中才能在Erlang中使用它.

至少一个纯二郎另类,但我与它没有经验,所以我不能亲自背书.


Dan*_*una 8

使用硬件上的标准浮点运算完成计算.有时会出现舍入错误.

你真的需要15位数的精度吗?

要获得更"精确"的值,有多种选择:

> round(Area). % Will round to integer
6
Run Code Online (Sandbox Code Playgroud)

或者你可以精确到圆形

round(Area * 10000000) / 10000000.
6.0
Run Code Online (Sandbox Code Playgroud)

如果目的是打印该值,则使用浮动的默认输出进行打印会降低精度.

io:format("~f~n", [Area]).
6.000000
ok
Run Code Online (Sandbox Code Playgroud)

或具有特定的精度

io:format("~.14f~n", [Area]).
6.00000000000000
ok
Run Code Online (Sandbox Code Playgroud)

HTH