平方根总和的比较

时间:2014-01-18 06:49:38

标签: 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;
}

如果使用-O0编译,程序将打印预期结果:

first == second

但是,如果使用-O1-O2-O3进行编译,程序将打印:( ideone上的结果)

first <  second
first == second

为什么呢?怎么解决?

1 个答案:

答案 0 :(得分:5)

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

要使用-ffloat-store选项,请使用不同的GCC优化获得相同的结果。