【发布时间】:2016-12-07 03:29:18
【问题描述】:
什么是 IEEE 754 浮点除法的可逆性?我的意思是,如果double y = 1.0 / x,那么x == 1.0 / y,即x,是否可以通过标准来保证可以精确地一点一点恢复?
y 为 infinity 或 NaN 的情况明显例外。
【问题讨论】:
-
在一些明显的情况下它不能,例如无穷大和不定,也可能是非规范化的数字。但对于其他人来说,这是一个很好的问题。
-
看起来这对于零和无穷大都可以正常工作......
-
通过简单的反例可以表明,IEEE-754 兼容的浮点倒数不能以这种方式恢复。例如,使用舍入模式到最近或偶数,
binary32:x=0x1.fffffep-1: 1.0f/x=0x1.000002p+0 1.0f/(1.0f/x)=0x1.fffffcp-1和binary64:x=0x1.fffffffffffffp-1: 1.0f/x=0x1.0000000000001p+0 1.0f/(1.0f/x)=0x1.ffffffffffffep-1 -
接受穷人的反例吗?对于
x = 100000,任何现代 CPU 都无法做到这一点,我很确定它们是 IEEE754 投诉... -
保证操作以无限精度进行,然后将结果强制转换为目标值。如果您开始在粗略步骤中引入舍入误差,则再次执行操作(即使以无限精度)不会导致原始结果。此外,现在您有许多输入在您反转时变得相同,并且当您再次反转时所有输入都应该导致不同的输出,这会推翻您的论点。
标签: c++ floating-point precision floating-accuracy ieee-754