2012-04-15 118 views
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); 
    } 
} 

它基本上计算10分之1000000,我知道结果不会是准确的,但在某些个它打印一个数字,略低于100000,而在其他情况下,它打印的数字稍大一些。

回答

5

如果你真的需要在所有的平台上使用同样的错误,你应该使用strictfp关键字在方法声明中,检查出所选择的答案对这个职位:When should I use the "strictfp" keyword in java?

让这段话指出,strictfp只有作品并且不会通过代码传播,所以如果您在中间调用某些方法,它们也应该有strictfp(也应该使用StrictMath而不是Math)。

无论如何,如果这不影响您的代码,只要让它成为......严格的浮点运算具有比常规浮点运算更高的计算成本。

+0

是strictfp一个** java **关键字吗?我从来没有听说过它... – user1335148 2012-04-15 22:48:50

+0

哇,我做了很长时间的Java,我读了很多关于Java,但我从来没有听说过这个关键字。谢谢你的启发。 ^^ – 2012-04-15 22:53:25

+0

@ user1335148是的,strictfp是一个Java关键字! – Fido 2012-04-15 22:54:09

2

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

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

+0

是否有可能在Java上手动设置编译器优化?还是仅仅是JVM的决定?在这种情况下,什么都不能做... – user1335148 2012-04-15 22:47:41

+0

是的,你[可以设置](http://developers.sun.com/solaris/articles/options.html)优化选项 – Attila 2012-04-15 23:03:51

+0

非常感谢那个链接! – user1335148 2012-04-15 23:33:50

1

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

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