2014-01-18 37 views
6

的總和我有MinGW的GCC 4.8.1和下面的代碼:比較 - 平方根

#include <iostream> 
#include <cmath> 

double eval(int a, int b){ 
    return std::sqrt(a) + std::sqrt(b); 
} 

int main(){ 
    double first = eval(545, 331); 
    double second = eval(545, 331); 

    if(first < second) 
     std::cout << "first < second" << std::endl; 
    if(first == second) 
     std::cout << "first == second" << std::endl; 
    if(first > second) 
     std::cout << "first > second" << std::endl; 
} 

如果有-O0編譯,程序打印預期的結果:

first == second 

但是,如果編號爲-O1,-O2-O3,程序打印出:(結果爲ideone

first < second 
first == second 

爲什麼?如何解決它?

+0

對於所有四個標誌(使用鏗鏘聲),coliru [它打印](http://coliru.stacked-crooked.com/a/0faa177acceb3caa)'first == second'。 – Shoe

+0

使用QtCreator 3.0.0,我得到了與MinGW 4.8相同的錯誤結果,而MSVC 2012 32位和64位在發佈模式下正常工作。所有調試配置工作。奇怪。 – Korchkidu

+0

此外,第一次和第二次打印似乎會根據打印結果是在打印之前還是在比較之後更改結果。 – Korchkidu

回答

5

在x86體系結構中,浮點精度爲80位,但double只有64位。使用GCC優化評估表達式得到一個浮點數並將其存儲在double上會導致不同的值,因爲優化會更改浮點數的調整方式以降低精度。

要使用-ffloat-store選項獲得與不同GCC優化相同的結果。