python何时引发FloatingPointError?

时间:2016-12-19 13:39:15

标签: python

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的时间吗?

2 个答案:

答案 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。
  •