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

时间:2018-07-04 10:00:04

标签: floating-point ieee-754

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

他指出,具有非规格化数字是好的,因为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时拥有x-y=0才是好特性?

非规格化数字有用吗?

1 个答案:

答案 0 :(得分:2)

William Kahan on gradual underflow的一些点:

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