这里有一个玩具示例,Python 表现出的行为令我惊讶:
def harmonic_mean(x, y):
return 2/(1/x+1/y)
print(harmonic_mean(0.0, 1.0))
在 IEEE-754 中,除以
0.0
不应停止执行,而应该只产生 inf
(或 -inf
或 NaN
)。因此,即使参数之一是 0.0
,上面的代码也应该有效。然而,它似乎停止并打印ZeroDivisionError: float division by zero
。这是否意味着即使在支持 IEEE-754 标准的平台上,Python 也不遵循该标准?除以 0.0
导致运行时错误而不是产生标准规定的结果的动机是什么?除了显式检查零之外,我还有其他办法解决这个问题吗?我知道在这个特定的例子中我可以改为例如使用以下内容:
def harmonic_mean(x, y):
return 2*x*y/(x+y)
但是,我想知道我可以更广泛地做什么。
例如,此处对此进行了讨论。
根据该讨论,Python 确实遵循 IEEE-754,通过引发异常来表示溢出或奇点。