了解非规范化浮点数的用处

Understanding the usefulness of denormalized floating point numbers

阅读 Goldberg 的 What Every Computer Scientist Should Know About Floating-Point Arithmetic,我发现了一些我不太理解的东西。

他说非规范化数字很好,因为 x = y 当且仅当 x-y==0。然后他举了个例子:

if (x != y) then 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 on gradual underflow的一些观点:

  • 如果浮点格式具有次正规值,则可表示值之间的差距不会随着数字的减少而增加。这有助于编写证明,因为可以断言,如果 x0 与其最近的邻居之间的差异是 u,那么,对于任何 xx0x,其最近邻至多为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) 中并非如此。