每当我搜索“非正规数”或“非正规数”这个术语时,我只会找到如何检测它们并将它们舍入为零的方法。显然,没有人真的喜欢它们,因为与它们打交道会导致性能下降。
然而,它们在各地实施。为什么?如果它是精确的,我会说你需要一个更大的浮动,或者改变你的操作顺序,这样你就可以避免非常小的中间值。我发现很难相信这一点额外的精确度真的值得珍贵的时钟周期。
为什么仍然会使用非正规数字有什么好的理由?如果没有明显的理由有非正规数字,为什么要实现它们呢?只是符合IEEE754标准?)
答案 0 :(得分:6)
简而言之,因为逐渐下溢保留了一些有用的数学恒等式(例如x-y == 0表示x == y)。关于为什么逐渐下溢可能有用的一些解释:
http://grouper.ieee.org/groups/754/faq.html#underflow
http://www.cs.berkeley.edu/~wkahan/ARITH_17U.pdf
是的,在某些情况下,由于应用程序设计错误而遇到下溢,并且正确的操作是修复应用程序。在其他情况下,正常下溢的应用程序将在突然下溢时失败。
此外,
在许多情况下,缓慢但正确的被认为是比快速但危险的更好的默认值。
由于逐渐下溢是默认设置,因此谷歌会发现人们抱怨并希望将其关闭。如果OTOH突然下溢是默认的,也许你会看到更多的人抱怨神秘的数字问题?数值编程很难实现!
现代hw减少了处理次正规数的惩罚。参见例如http://www.agner.org/optimize/blog/read.php?i=142&v=t
答案 1 :(得分:3)
非正规非常有用;浮点计算有许多有用的误差范围,如果你删除非正规数就不再成立(最重要的是x-y == 0
当且仅当x == y
时)。
同样重要的是要记住(a)非正规不会对所有硬件造成损失;存在能够以速度(或非常接近它)处理非正规数的系统和(b)非正规数只会在你遇到计算器时减慢计算速度。如果你不使用它们,你就不会为它们付费(如果你最终使用它们,那么没有它们你的结果可能会出错 - 如果你只是想要一个错误的话尽快回答,您可以用return 0
替换整个计算。