IEEE 754 浮点除法的可逆性
Invertability of IEEE 754 floating-point division
IEEE 754 浮点除法的可逆性是多少?我的意思是标准是否保证如果 double y = 1.0 / x
那么 x == 1.0 / y
,即 x
可以一点一点地精确恢复?
y
为 infinity
或 NaN
的情况明显例外。
显然不是。 1/10 没有代表。你得到一个近似值。反转不会给你 10.
编辑:有很多这样的。任何需要超过 53 位的逆将是其中之一。
有一个简单的测试。在 C 中,您可以针对 10.0 测试 1.0/(1.0/10.0),您会发现它们不相等。
是的,有这样的 IEEE 754 双精度 (*) 值 x
x != 1.0 / (1.0 / x)
。
用这个属性手工构建一个正常值的例子很容易:在C99's hexadecimal notation for floating-point values中写0x1.fffffffffffffp0
的那个是这样的1.0 / (1.0 / 0x1.fffffffffffffp0) == 0x1.ffffffffffffep0
。很自然地期望 0x1.fffffffffffffp0
是一个反例,因为 1.0 / 0x1.fffffffffffffp0
落在 binade 的开头,那里的浮点数密度较低,因此必须在最里面发生较大的相对误差分配。更准确地说,1.0 / 0x1.fffffffffffffp0
正好落在 0.5
和它的双精度后继者之间的中点之上,因此 1.0 / 0x1.fffffffffffffp0
向上舍入到 0.5 的后继者,具有较大的相对误差。
在十进制%.16e
格式中,0x1.fffffffffffffp0
是1.9999999999999998e+00
,0x1.ffffffffffffep0
是1.9999999999999996e+00
。
(*) 对于任何 IEEE 754 格式
,反函数没有理由在问题中包含 属性
IEEE 754 浮点除法的可逆性是多少?我的意思是标准是否保证如果 double y = 1.0 / x
那么 x == 1.0 / y
,即 x
可以一点一点地精确恢复?
y
为 infinity
或 NaN
的情况明显例外。
显然不是。 1/10 没有代表。你得到一个近似值。反转不会给你 10.
编辑:有很多这样的。任何需要超过 53 位的逆将是其中之一。
有一个简单的测试。在 C 中,您可以针对 10.0 测试 1.0/(1.0/10.0),您会发现它们不相等。
是的,有这样的 IEEE 754 双精度 (*) 值 x
x != 1.0 / (1.0 / x)
。
用这个属性手工构建一个正常值的例子很容易:在C99's hexadecimal notation for floating-point values中写0x1.fffffffffffffp0
的那个是这样的1.0 / (1.0 / 0x1.fffffffffffffp0) == 0x1.ffffffffffffep0
。很自然地期望 0x1.fffffffffffffp0
是一个反例,因为 1.0 / 0x1.fffffffffffffp0
落在 binade 的开头,那里的浮点数密度较低,因此必须在最里面发生较大的相对误差分配。更准确地说,1.0 / 0x1.fffffffffffffp0
正好落在 0.5
和它的双精度后继者之间的中点之上,因此 1.0 / 0x1.fffffffffffffp0
向上舍入到 0.5 的后继者,具有较大的相对误差。
在十进制%.16e
格式中,0x1.fffffffffffffp0
是1.9999999999999998e+00
,0x1.ffffffffffffep0
是1.9999999999999996e+00
。
(*) 对于任何 IEEE 754 格式
,反函数没有理由在问题中包含 属性