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,几乎没有意义。当然,你是对的。