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中使用它.
有至少一个纯二郎另类,但我与它没有经验,所以我不能亲自背书.
使用硬件上的标准浮点运算完成计算.有时会出现舍入错误.
你真的需要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