我有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)
为什么?怎么解决?
在x86架构中,浮点精度为80位,但a double只有64位.并且GCC优化评估表达式导致浮点数并将其存储在a上double会产生不同的值,因为优化会更改浮点数如何调整到更低的精度.
要使用不同的GCC Otimizations获得相同的结果,请使用-ffloat-store选项.
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |