Python文档说浮点计算失败时会引发FloatingPointError。但“浮动计算”在这里究竟是什么意思呢?
我尝试使用浮点数进行添加,乘法和除法,但从未设法提出此特定错误。相反,我得到了TypeError
:
10/'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'int' and 'str'
有人可以帮我理解在python中引发FloatingPointError
的时间吗?
答案 0 :(得分:13)
它是fpectl
模块的一部分。如果您未明确启用fpectl.turnon_sigfpe()
),则不应引发FloatingPointError
。
但请注意:
默认情况下不构建
fpectl
模块,不鼓励使用它,除非在专家手中,否则可能很危险。有关详细信息,另请参阅有关限制的fpectl-limitations
部分。
更新:fpectl
模块已removed as of Python 3.7。
即使启用了FloatingPointErrors,10/'a'
也永远不会引发一个。它总会引发TypeError。只有在达到实际执行浮点数学运算的操作(例如1.0/0.0
)时才会引发FloatingPointError。 10/'a'
没有那么远。
答案 1 :(得分:2)
您还可以通过设置相应的numpy.seterr
(或numpy.errstate
上下文管理器)标记,在FloatingPointError
内触发numpy
。有关从文档中获取的示例:
>>> np.sqrt(-1) nan >>> with np.errstate(invalid='raise'): ... np.sqrt(-1) Traceback (most recent call last): File "<stdin>", line 2, in <module> FloatingPointError: invalid value encountered in sqrt
有趣的是,当所有操作数都是整数时,它也会引发FloatingPointError
:
>>> old_settings = np.seterr(all='warn', over='raise') >>> np.int16(32000) * np.int16(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> FloatingPointError: overflow encountered in short_scalars
该文档说明了FloatingPointError
将被提出的条件:
浮点异常在IEEE 754标准[1]中定义:
- 除以零:从有限数字中获得无限结果。
- 溢出:结果太大而无法表达。
- 下溢:结果如此接近于零,导致精度丢失。
- 无效操作:结果不是可表达的数字,通常表示生成了NaN。