【发布时间】:2019-02-15 10:09:01
【问题描述】:
漂亮basic代码:
#include <iostream>
int main() {
std::cout.precision(100);
double a = 9.79999999999063220457173883914947509765625;
double b = 0.057762265046662104872599030613855575211346149444580078125;
const double bConst = 0.057762265046662104872599030613855575211346149444580078125;
double c = a * b;
std::cout << " a: " << a << std::endl;
std::cout << " b: " << b << std::endl;
std::cout << " bConst: " << bConst << std::endl;
std::cout << " c: " << c << std::endl << std::endl;
std::cout << " c/b: " << c / b << std::endl;
std::cout << " c/bConst: " << c / bConst << std::endl;
}
哪些输出:
a: 9.79999999999063220457173883914947509765625
b: 0.057762265046662104872599030613855575211346149444580078125
bConst: 0.057762265046662104872599030613855575211346149444580078125
c: 0.5660701974567474703547986791818402707576751708984375
c/b: 9.7999999999906304282148994388990104198455810546875
c/bConst: 9.79999999999063220457173883914947509765625
如您所见,b 和 bConst 似乎使用相同的值进行处理 - 即它为相同的 0.057762265046662104872599030613855575211346149444580078125 值打印。
所以我猜他们是“存储”的都是一样的。唯一的区别是b 不是const。
然后,我做了两次相同的c / b 操作:一次使用b,另一次使用bConst。
如您所见,它会导致两种不同的结果。这让我感到好奇。
您能从技术上解释为什么会发生这种情况吗?
【问题讨论】:
-
这里(mingw-w64 with g++ 8.1)使用 -O2 优化时,两个结果都是相同的,我使用 -Ofast 得到你的结果。
-
我以为您在另一个问题stackoverflow.com/q/54694274/5470596中了解了
-Ofast对浮动操作确定性的反作用@
标签: c++ optimization floating-point constants