所以我正在写一个程序进行一些计算,我注意到我没有得到我预期的结果。
我正在使用Math.acos()和Math.sqrt()函数,当我希望得到零答案时,我的答案几乎为零。
> System.out.println(Math.acos(27441738 / (Math.sqrt(27441738)*Math.sqrt(27441738))));
1.4901161193847656E-8
这通常应打印出0.0。我在这里缺少什么吗?
答案 0 :(得分:1)
没有一般规则来缩小涉及浮点运算的表达式中的错误。
对于这种特殊情况,您可以使用fraction rationalization来彻底缓解错误:
-------------
x x 1 x 1 √x | x √x |
1 = -------- = --- * --- = --- * --- * --- = | --- * --- |
√x * √x √x √x √x √x √x | √x x |
-------------
评估新表达式(使用bsh
):
System.out.println( Math.acos( (27441738 / Math.sqrt(27441738)) * (Math.sqrt(27441738) / 27441738) ) );
打印:
0.0
有关建议阅读的事情,正如其他人已经指出获得有关FP的信息的一个很好的起点是“What Every Computer Scientist Should Know About Floating-Point Arithmetic”详细论述浮点运算,尽管我更喜欢Computer Representation of Numbers and Computer Arithmetic,它更简单,更具教学意义,它甚至以玩具fp系统开始,向您介绍浮点运算的复杂概念。