2012-04-15 112 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

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

要獲得相同的結果,您應該將精度限制爲特定的小數位數。