Java Math.acos()返回值

时间:2013-09-06 16:21:44

标签: java

所以我正在写一个程序进行一些计算,我注意到我没有得到我预期的结果。

我正在使用Math.acos()和Math.sqrt()函数,当我希望得到零答案时,我的答案几乎为零。

> System.out.println(Math.acos(27441738 / (Math.sqrt(27441738)*Math.sqrt(27441738))));
1.4901161193847656E-8

这通常应打印出0.0。我在这里缺少什么吗?

1 个答案:

答案 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系统开始,向您介绍浮点运算的复杂概念。