我有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 :(得分:5)
在x86架构中,浮点的精度为80位,但double
只有64位。并且GCC优化评估表达式导致浮点数并将其存储在double
上可能会产生不同的值,因为优化会更改浮点数的调整精度。
要使用-ffloat-store
选项,请使用不同的GCC优化获得相同的结果。