我在读一本书(CSAPP)。书中写道——
浮点加法满足以下单调性属性:
ifa>=b
then(x + a) >= (x+b)
对于任何值a
,b
并且x
除了NaN
. 无符号或二进制补码加法不遵守实数(和整数)加法的这一特性。
浮点如何服从它?
为什么无符号或二进制补码加法不遵守它?
我在读一本书(CSAPP)。书中写道——
浮点加法满足以下单调性属性:
ifa>=b
then(x + a) >= (x+b)
对于任何值a
,b
并且x
除了NaN
. 无符号或二进制补码加法不遵守实数(和整数)加法的这一特性。
浮点如何服从它?
为什么无符号或二进制补码加法不遵守它?
C 中的无符号整数基本上形成一个环,即它们最终会环绕。例如,对一个无符号整数连续加 1 会不断增加它,直到它回绕为零,这意味着加一产生的结果至少小于 1,因此不满足单调性。
有符号整数会溢出,这更复杂,但在 C 中它也是未定义的行为,所以我们应该排除它。
对于 C 中的浮点数,根据 IEEE745,将两个正数相加(这意味着它们都不是 NaN,因为不知道 NaN 是正数还是负数)产生大于或等于两个加数中较大者的结果:要么通过形成一个确实更大的结果,要么通过产生一个加数,因为另一个加数被吸收,或者通过产生无穷大。重要的一点是要注意,加法满足单调性,但不一定是严格单调性。