我们可以说 0.5*x + 0.5*x == x 总是正确的吗?

Can we say that it's always true that 0.5*x + 0.5*x == x?

0.52 的(负)次幂,这意味着它可以用 IEEE-754 二进制浮点格式 精确表示。单精度是 0'01111110'00000000000000000000000.

根据我关闭优化的快速测试 (-O0),事实证明如果 y = 0.5 * x,则 y + y == x。但它总是由 IEEE-754 标准保证吗?

我知道一般来说如果n2的正整数次方,和m = 1.0 / ny = m * x,那么把y加起来n 次不会产生 x。不过好像用n = 2是的。

我错过了什么吗?

不,这是一个带有 double 精度浮点数的简单计数器示例:

double x = 4.9E-324; // minimum positive value
double y = x * 0.5; // this doesn't only look like a zero this positive zero all 0 bits
bool test = y + y == x; // false

IEEE-754 下的浮点数精度有限,除以 2 时可能会丢失信息。在大多数情况下,当使数字变小以获得准确性时,您可以减少指数,但如上所述,这并不总是足够的。有时你不能减少指数。

任何具有最小指数和奇数尾数的东西都不成立。这样的例子就是x = 5.0E-322.