2017-02-25 41 views
-1

這裏是我的代碼的一部分(I縮影它):2計算機得到不同的輸出

#include <iostream> 
#include <cmath> 
#include <iomanip> 

int main() 
{ 
    double pi = M_PI; 
    long long x = 12026548095792; 
    std::cout << std::fixed << std::setprecision(8) << pi * x; 
} 

我的計算機的輸出是:

37782515145784.46100000 

(視窗7 64,處理器:英特爾(R )Core(TM)i3-2328M CPU @ 2.20ghz)。
但是,當我跑我的SPOJ代碼,輸出是

37782515145784.46093750 

(集羣:多維數據集(英特爾G860))。
請幫我解釋一下這個問題。

更新:我用codeblocks 16.01,gcc版本5.3.0。

+1

也發佈編譯標誌 – Mikhail

+0

也許像http://christian-seiler.de/projekte/fpmath/或https://gcc.gnu.org/wiki/FloatingPointMath可能會解釋發生了什麼。如何解決這個問題取決於你使用的特定編譯器和一組目標平臺。 – SergGr

+0

謝謝你的幫助。 –

回答

1

雙的精度爲15位,所以這兩個數字是相同的(他們在自己的「垃圾部分」不同)

這很可能是由於對如何FP單元內部工作(可能是80位)以及傳遞給FP單元時如何處理兩倍(可能通過零填充精度過剩或通過簡單地將垃圾運送得更快)

也許還有一種方式M_PI是定義事項。 你試過類似acos(-1)的東西嗎?

一般來說,不要期望FP計算是準確的,並且無處不在。

相關問題