floating-point - 什么时候非范数真正有用?

标签 floating-point ieee-754

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

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

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

最佳答案

简而言之,因为逐渐下溢保留了一些有用的数学恒等式(例如 x-y == 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
  • 关于floating-point - 什么时候非范数真正有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10583321/

    相关文章:

    python - 使用 float ('nan' ) 来表示缺失值 - 安全吗?

    javascript - 在 JavaScript 中使用带小数点的 float 的最佳方法是什么?

    floating-point - 求解二次方程的数值稳定方法

    c++ - 32 位到 16 位浮点转换

    floating-point - 大于 1 的最小反/标准化数是多少?(64 位)

    c++ - 浮点比较精度

    javascript - javascript中的双值

    .net - .NET十进制,IEEE十进制…关于此以及将来的任何讨论?

    java - 将位转换为 double 后,如何在不使用 BigDecimal 的情况下存储实际的浮点/ double 值?

    c# - float/double/decimal 中的精度数字是什么意思?