下面是一个玩具示例,在该示例中,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
.这是否意味着Python不遵循IEEE-754标准,即使在支持它的平台上也是如此?为什么要让除以0.0
导致运行时错误,而不是产生标准规定的结果?除了显式判断零之外,我还有别的方法吗?我知道在这个特定的例子中,我可以使用以下代码:
def harmonic_mean(x, y):
return 2*x*y/(x+y)
然而,我想知道我还能做些什么.
编辑:我要补充的是,我感到惊讶的一个原因是,我已经看到NumPy的行为基本上与我在被零除数的情况下预期的一样.作为一个例子,考虑一下大约np.array([-1.0, 0.0, 1.0])/0.0
个.除以零会导致在命令行中打印一条警告,内容为RuntimeWarning: divide by zero encountered in divide
,但结果仍然是[-inf nan inf]
,正如我所预期的那样.