我知道结果接近于零的算术运算有时可能是非关联的。这直接来自机器 epsilon 的定义。然而,我决定用它测试另一个等式,并得到了一些意想不到的结果。
//just calculate
float epsilon_float = 1.0f;
auto counter_float = 0;
while ((epsilon_float / 2 + 1.0f) != 1.0f) {
epsilon_float /= 2;
counter_float += 1;
}
std::cout << (1 < 1 + epsilon_float) << std::endl;
std::cout << (1 == 1 + epsilon_float / 2) << std::endl;
std::cout << (1 + epsilon_float > 1 + epsilon_float / 2) << std::endl; // By definition
std::cout << (1 + epsilon_float + epsilon_float / 2 >
1 + epsilon_float / 2 + epsilon_float) << std::endl; // Non-associativity
std::cout << (1 + epsilon_float < 1 + epsilon_float + epsilon_float / 2) // its true
<< std::endl;
我无法理解为什么不等式的第二部分结果大于第一部分,因为据我所知,机器 epsilon 是与 1 相加时给出非 1 结果的最小数字。但这里 eps/2 加起来大于一