非正规数什么时候真正有用?

问题描述 投票:0回答:3

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

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

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

floating-point ieee-754
3个回答
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 突然下溢是默认值,也许您会看到更多的人抱怨神秘的数字问题?数值编程已经够难的了!

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


4
投票

非正规化非常有用;浮点计算中有许多有用的错误界限,如果删除非正规数,这些错误界限将不再成立(最重要的是

x-y == 0
当且仅当
x == y
)。

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

return 0
)。


0
投票

它们什么时候真正有用?通过一点点数字字符串格式,您可以执行非常特定类型的整数乘法,达到完整的 2546 位精度,跨越 767 个十进制数字,而无需使用任何

bigint
库 :

mawk '($++NF = sprintf("%.971g",
       __ = (__ = (_ = 4)^-_^_ * (_*_ + _*_)^-(--_ + --_)) * \
      (_^(___ = _+_ * ++_^_ - _--) - ___^_) * __))^(_=!_)' /dev/null | 

mawk NF=NF FS='^[+-]?0*|[.]|[Ee][+-]?[0-9]+$' OFS= | gfactor -h

( 2^53 - 53^2 ) :: prime mantissa        :: 9007199254738183
        
* ( 2^-537 )^2  :: denormalized exponent ::            -1074

4450147717013014935781297373122216146699265127089690208121111
1955111373994456919942086443016410324138877948439594767734600
7536130200074723901263493586735348385956170076834788225586871
0149848553243418642303155745857768066392178700185848375665128
6183187932225415240609383686118875212320163715549033691533037
4701932436869896231904002909185639280797110767721194314409888
1217775019873316067010633149112292451404615942454658064565101
3196980899131817300804181744883611272850174152498261912527633
9848161883339769210577524860725090013626969081174367749462595
5381589884432923914606931238647593865468520532049239161439367
3486883291686813158861578968854832701582723405942766297839566
1130263385441340464878930937622541158627259056070659673162714
93103840839467011392116546630859375:
        5^1074
        9007199254738183
© www.soinside.com 2019 - 2024. All rights reserved.