我们可以说0.5*x + 0.5*x == x总是如此吗?

pla*_*cel 4 floating-point precision floating-accuracy ieee-754

0.5是(负)幂2,这意味着它可以完全由IEEE-754二进制浮点格式表示.在信号精确度方面0'01111110'00000000000000000000000.

根据我关闭优化的快速测试(-O0),结果是if y = 0.5 * x,然后y + y == x.但它是否始终由IEEE-754标准保证?

我知道,在一般的如果n是一个正整数幂2,并且m = 1.0 / n,y = m * x,然后加y在一起的n时候不会产生x.但似乎n = 2是的.

我错过了什么吗?

Mei*_*aor 6

不,这是一个具有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
Run Code Online (Sandbox Code Playgroud)

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

任何具有最小指数和奇数尾数的东西都不会保持相等.这样的例子是x = 5.0E-322.