了解非规范化浮点数的有用性



读戈德堡的《每个计算机科学家都应该知道的关于浮点算术的知识》,我发现了一些我不太理解的东西。

他指出,拥有非规范化数字是好的,因为x = y当且仅当x-y==0。然后他举了一个例子:

如果 (x != y(

则 z = 1/(x-y(

现在,假设x-y是一个非规范化的数字。那么1/(x-y)很有可能会变得inf.如果我们一开始没有非规范化数字,这是相同的结果。

甚至,如果我想执行除法,并避免inf结果,那么如果我们没有非规范化数字,那就更方便了:

if (x-y) then z = 1/(x-y) // here, we know that z is not inf

我无法用非规范化数字实现相同的结果,因为x-y可能不是零,而是一个非规范化的数字,然后1/(x-y)除将导致inf。所以,在这里,非规范化数字实际上会引起麻烦。

为什么当且仅当x-y=0拥有x=y是一个好属性?

当非规范化数字有用时?

William Kahan关于逐渐下溢的一些观点:

  • 如果浮点格式具有次正规值,则可表示值之间的间隙不会随着数字的减少而增加。这在编写证明时很有帮助,因为可以断言,如果 x 0 与其最近邻之间的差值为 u,那么对于任何 x ≤x0,x与其最近邻之间的差值最多为u然后你可以继续得出结论,只要输入在边界内,某些计算序列产生的误差最多是某个值。如果没有次正规值,则必须编写异常,其中考虑中间值溢出的情况,将证明分为多个情况,排除证明域的某些部分,等等。
  • x ±y不能下溢,因为次正态差值是精确的。
  • 只要至少有一个项是正态的,乘积总和从次正规项中受到的舍入误差较小。

该论文并没有声称逐渐下溢在每种情况下都优越,但事实证明总体上是可取的。

当你给出这个例子时:

if (x-y) then z = 1/(x-y) // here, we know that z is not inf

这限制了效用,因为它在if (x-y) then z = 4/(x-y)中是不正确的。

最新更新