6

每当我搜索术语“非正规数”或“非正规数”时,我只能找到如何检测它们并将它们四舍五入的方法。显然,没有人真正喜欢它们,因为与它们打交道会导致性能损失。

然而,它们无处不在。为什么?如果是为了精确,我会说你需要一个更大的浮点数,或者改变你的操作顺序,这样你就可以避免非常小的中间值。我很难相信一点点额外的精度真的值得宝贵的时钟周期。

有什么好的理由仍然使用非正规数吗?如果没有重要的理由产生非正规数,为什么要实施它们呢?只是为了符合 IEEE754 标准?)

4

2 回答 2

6

简而言之,因为逐渐下溢保留了一些有用的数学恒等式(例如 xy == 0 意味着 x == y)。关于为什么逐渐下溢可能有用的一些解释:

http://grouper.ieee.org/groups/754/faq.html#underflow

http://www.cs.berkeley.edu/~wkahan/ARITH_17U.pdf

是的,在某些情况下,由于糟糕的应用程序设计会遇到下溢,正确的措施是修复应用程序。在其他情况下,在逐渐下溢下正常工作的应用程序会在突然下溢下失败。

此外,

  • 在许多情况下,慢但正确被认为比快速但危险更好的默认设置。

  • 由于逐渐下溢是默认设置,谷歌发现人们对此抱怨并希望将其关闭。如果 OTOH 突然下溢是默认设置,也许您会看到更多人抱怨神秘的数字问题?数值编程已经够难了!

  • 现代硬件减少了使用次正规数的惩罚。参见例如http://www.agner.org/optimize/blog/read.php?i=142&v=t

于 2012-05-14T12:59:29.143 回答
3

非正规非常有用;浮点计算中有许多有用的错误界限,如果您删除非正规(最重要的是x-y == 0当且仅当x == y),这些错误界限将不再正确。

同样重要的是要记住(a)非规范化不会对所有硬件造成惩罚;存在可以快速(或非常接近)处理非规范化的系统,并且(b)非规范化只会在您实际遇到非规范化时减慢您的计算速度。如果您不使用它们,则无需为它们付费(如果您最终使用它们,那么如果没有它们,您的结果可能会是错误的——如果您只是想尽快得到错误的答案,您可以用 ) 替换整个计算return 0

于 2012-05-14T13:03:33.003 回答