平方根总和的比较

joh*_*902 6 c++ sqrt

我有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;
}
Run Code Online (Sandbox Code Playgroud)

如果编译-O0,程序打印预期的结果:

first == second
Run Code Online (Sandbox Code Playgroud)

但是,如果使用-O1,-O2或编译-O3程序打印:(结果在ideone上)

first <  second
first == second
Run Code Online (Sandbox Code Playgroud)

为什么?怎么解决?

rul*_*lof 5

在x86架构中,浮点精度为80位,但a double只有64位.并且GCC优化评估表达式导致浮点数并将其存储在a上double会产生不同的值,因为优化会更改浮点数如何调整到更低的精度.

要使用不同的GCC Otimizations获得相同的结果,请使用-ffloat-store选项.