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
。