浮点运算的结果不同

  • 本文关键字:结果 浮点运算 java
  • 更新时间 :
  • 英文 :


我遇到了一个小问题,我有一些代码可以从给定的数据集中计算平均值,我从几台不同的计算机上执行此操作(一些使用 linux,一些使用 Windows,一些 32 位,另一些使用 64 位),但是当我观察数据库结果时,一些应该相等的值略有不同。

这对我的程序没有区别,但我想知道为什么会这样,我的印象是具有相同字长的浮点运算应该产生相同的结果(我显然错了)。

这是我编写的一个小示例代码来检查:

public class Test{
    public static void main(String... args){
        double counter = 0, value = 1./10;
        for (int i = 0; i < 1000000; i++){
            counter += value;
        }
        System.out.println(counter);
    }
}

它基本上计算 1000000/10,我知道结果不会准确,但在某些 pcs 中,它打印的数字略小于 100000,而在其他情况下,它打印的数字略大。

如果你真的需要在所有平台上都出现同样的错误,你应该在你的方法声明中使用strictfp关键字,请查看这篇文章中的选定答案: 我什么时候应该在java中使用"strictfp"关键字?

请注意,strictfp仅适用于当前块,并且不会通过代码传播,因此如果您在中间调用某些方法,它们也应该strictfp(您也应该使用 StrictMath 而不是 Math )。

无论如何,如果这不会影响您的代码,那就顺其自然吧......严格浮点运算的计算开销高于常规浮点运算。

我认为这取决于所使用的编译器优化技术。 例如,如果没有优化,你会得到大量的加法,导致可能会失去精度,使用可以理解所涉及的操作的编译器,整个循环可能会被替换为counter = value*1000000

double及其操作的精度在语言中精确设置

不同的板形式有不同的浮点表示方式。

要获得相同的结果,您应该将精度限制为特定的小数位数。

最新更新