1

我有一个小问题,我有一些代码可以从给定的数据集计算平均值,我在几台不同的计算机上执行此操作(一些使用 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,我知道结果并不准确,但在某些电脑中,它打印的数字略小于 100000,而在其他情况下,它打印的数字略大。

4

3 回答 3

5

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

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

无论如何,如果这不会影响您的代码,那就顺其自然吧……严格的浮点运算比常规浮点运算具有更高的计算成本。

于 2012-04-15T22:45:50.443 回答
2

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

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

于 2012-04-15T22:37:09.823 回答
1

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

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

于 2012-04-15T22:41:32.693 回答