IEEE 754浮点除法的可逆性是什么?我的意思是由标准保证如果double y = 1.0 / x
然后x == 1.0 / y
,即x
可以精确地一点一点恢复?y
是infinity
或NaN
的情况是明显的异常(exception)。
最佳答案
是的,IEEE 754 double (*)值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的开头,而binade的浮点数密度较小,因此最里面的除法必须发生较大的相对误差。更准确地说,1.0 / 0x1.fffffffffffffp0
恰好位于0.5
及其 double 后继字符之间的中点上方,因此1.0 / 0x1.fffffffffffffp0
舍入为0.5的后继字符,并且具有较大的相对误差。
采用十进制%.16e
格式,0x1.fffffffffffffp0
是1.9999999999999998e+00
,0x1.ffffffffffffep0
是1.9999999999999996e+00
。
(*)对于任何IEEE 754格式,没有理由使反函数具有该属性