在c / c++中,给定以下具有任意值的浮点变量。
float a, b, c, d;
在下面的语句中,我们可以假设它们中的任何一对总是会产生相同的结果吗?
float result_1 = a + b + c + d - c;
float result_2= a + b + c + (d - c);
float result_3 = a + b + d;
另外,是否对以下谓词有保证:
a + b - b == a
最佳答案
不,您不能假设这一点。我打破了您的所有三个示例:(Live)
#include <iostream>
int main()
{
double a = 1, b = 1e100, c= 1e100, d= 1, c2 = .1, d2 = -.1, b2 = 1;
std::cout << ( a + b2 + c2 + d2 - c2 == a + b2 + c2 + (d2 - c2)) << "\n"
<< ( a + b2 + c + d - c == a + b2 + d) << "\n"
<< ( a == a + b -b);
}
输出:
对于浮点类型,
==
和!=
始终不安全,因为它们具有舍入错误。