我们可以说 0.5*x + 0.5*x == x 总是正确的吗?
Can we say that it's always true that 0.5*x + 0.5*x == x?
0.5
是 2
的(负)次幂,这意味着它可以用 IEEE-754 二进制浮点格式 精确表示。单精度是 0'01111110'00000000000000000000000
.
根据我关闭优化的快速测试 (-O0
),事实证明如果 y = 0.5 * x
,则 y + y == x
。但它总是由 IEEE-754 标准保证吗?
我知道一般来说如果n
是2
的正整数次方,和m = 1.0 / n
、y = 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
.
0.5
是 2
的(负)次幂,这意味着它可以用 IEEE-754 二进制浮点格式 精确表示。单精度是 0'01111110'00000000000000000000000
.
根据我关闭优化的快速测试 (-O0
),事实证明如果 y = 0.5 * x
,则 y + y == x
。但它总是由 IEEE-754 标准保证吗?
我知道一般来说如果n
是2
的正整数次方,和m = 1.0 / n
、y = 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
.