【问题标题】:Invertability of IEEE 754 floating-point divisionIEEE 754 浮点除法的可逆性
【发布时间】:2016-12-07 03:29:18
【问题描述】:

什么是 IEEE 754 浮点除法的可逆性?我的意思是,如果double y = 1.0 / x,那么x == 1.0 / y,即x,是否可以通过标准来保证可以精确地一点一点恢复?

yinfinityNaN 的情况明显例外。

【问题讨论】:

  • 在一些明显的情况下它不能,例如无穷大和不定,也可能是非规范化的数字。但对于其他人来说,这是一个很好的问题。
  • 看起来这对于零和无穷大都可以正常工作......
  • 通过简单的反例可以表明,IEEE-754 兼容的浮点倒数不能以这种方式恢复。例如,使用舍入模式到最近或偶数,binary32:x=0x1.fffffep-1: 1.0f/x=0x1.000002p+0 1.0f/(1.0f/x)=0x1.fffffcp-1binary64: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


【解决方案1】:

是的,有 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.fffffffffffffp01.9999999999999998e+000x1.ffffffffffffep01.9999999999999996e+00

(*) 对于任何 IEEE 754 格式,反函数没有理由具有问题中的属性

【讨论】:

  • 一个有趣且容易证明的事实是(假设避免了上溢和下溢,IEEE 754 二进制格式,舍入到偶数等),任何浮点 x 其分数在[1.0, sqrt(2)] 范围内将具有1.0 / (1.0 / x) == x 的属性。
【解决方案2】:

显然不是。 1/10 没有代表。你得到一个近似值。反转不会给你 10。

编辑:其中有很多。任何需要超过 53 位的逆都将是其中之一。

有一个简单的测试。在 C 语言中,您可以针对 10.0 测试 1.0/(1.0/10.0),您会发现它们并不相等。

【讨论】:

  • 什么不是真的?不能表示 0.1 或者反转不是 0.1 的值不会产生 10?设备如何知道 (1/10)-eps 应该是 1/10 而不是近似值?
  • 那么反转 1/10 会带来什么?
  • 反转 0.1(不能用二进制表示。见grouper.ieee.org/groups/754/faq.html#binary-decimal)。它应该等于 1/(0.1+e) 其中 e 是表示错误输入 它不是由于后处理造成的。所以我概述的测试工作/不工作取决于实施和取决于有时正确/有时错误的情况。 (另见:exploringbinary.com/…
  • 对不起,有缺陷的假设。 1/X 可能是近似的,但 (1/X) * X 也是如此。现在的问题是,这些近似值是否总是 取消。一个反例就足够了。正如plasmacel 所示,1/10 并不是反例。
猜你喜欢
  • 2012-01-06
  • 2014-10-18
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多