为何np.exp(1000)触发溢出警告,而np.exp(-100000)无下溢警告?
NumPy exp函数溢出警告与下溢无警告的原因分析
问题场景
执行以下代码时会触发溢出警告:
>>> import numpy as np >>> np.exp(1000) <stdin>:1: RuntimeWarning: overflow encountered in exp
但执行下方代码却未出现下溢警告:
>>> np.exp(-100000) 0.0
核心原因
默认警告策略差异:NumPy对溢出和下溢的默认警告逻辑不同。溢出会主动抛出
RuntimeWarning,而下溢警告默认是被抑制的。这是因为下溢产生的0.0在多数数值计算场景中属于可接受的结果,不会像溢出得到的inf那样容易引发后续计算异常。IEEE 754浮点数标准规范:根据IEEE 754标准,当计算结果小于浮点数能表示的最小正数值时,会被舍入为
0.0,这个过程称为渐下溢,属于标准允许的常规行为,NumPy默认不对该情况发出警告;而溢出得到的inf是超出浮点数范围的异常值,因此会触发警告。可手动开启下溢警告:如果需要监控下溢情况,可以通过修改NumPy的警告配置来开启,示例如下:
>>> import numpy as np >>> np.seterr(under='warn') # 将下溢警告设置为开启 {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'} >>> np.exp(-100000) <stdin>:1: RuntimeWarning: underflow encountered in exp 0.0
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

