Floating point 我们能说它';0.5*x+;0.5*x==x?

Floating point 我们能说它';0.5*x+;0.5*x==x?,floating-point,precision,floating-accuracy,ieee-754,Floating Point,Precision,Floating Accuracy,Ieee 754,0.5是2的(负)幂,这意味着它完全可以用IEEE-754二进制浮点格式表示。在单精度中,它是0'011111110'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时yes 我遗漏了什么吗?没有,下面是一个简单的反示例,其中包含双精度浮点: double x =

0.5
2
的(负)幂,这意味着它完全可以用IEEE-754二进制浮点格式表示。在单精度中,它是
0'011111110'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时
yes


我遗漏了什么吗?

没有,下面是一个简单的反示例,其中包含
双精度浮点:

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

可能重复的@mehulmpt问题是关于
0.2+0.1!=0.3
,因为
0.2
0.1
不能用任何二进制浮点格式精确表示,这一点是显而易见的。我想你不明白这里的区别。嗯,是的,最小值确实是一个反例。任何具有最小指数和奇数mantisa的东西。试试5.0E-322Nice!将此项也添加到答案中。如果
x
NaN
,则此项也将为false。对于NaN,x==x为false,几乎没有意义。当然,你是对的。