下面是一个玩具示例,在该示例中,Python展示了令我惊讶的行为:

def harmonic_mean(x, y):
    return 2/(1/x+1/y)

print(harmonic_mean(0.0, 1.0))

在IEEE-754中,除以0.0不应该停止执行,而是应该产生inf(或-infNaN).因此,即使其中一个参数是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],正如我所预期的那样.

推荐答案

根据IEEE 754-2019标准:

exception:当对某些特定操作数的操作没有适用于每个合理应用程序的结果时发生的事件.该操作可能通过调用默认异常处理或替代异常处理来发出异常信号.异常处理可能会发出进一步异常的信号.认识到事件、异常和信号在不同的编程环境中以不同的方式定义.

换句话说,虽然继续正常执行InfNaN结果将是对被零除try 的顺从响应,但非本地返回也是如此,就像使用Python时的情况一样.

这样做的动机是假设这种类型的划分可能是偶然的,并且(考虑到所有事情)最好是立即发出错误信号,而不是让结果在以后导致更细微的错误.如果这不能满足您的需要,您可以使用numpy来表示不同的语义.

The Zen of Python人起:

Errors should never pass silently.
Unless explicitly silenced.

在这一点上,‘754还建议实现允许用户修改异常处理的语义,例如无错误地传递,在其他地方记录错误,和/或替换一些任意结果.但这不是’754标准的要求:它使用在其他地方定义为表示它是"特别适合"或"首选但不一定需要"的单词"应该".

Python相关问答推荐

仿制药的类型铸造

什么相当于pytorch中的numpy累积ufunc

OR—Tools CP SAT条件约束

Python—从np.array中 Select 复杂的列子集

我如何根据前一个连续数字改变一串数字?

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

Python列表不会在条件while循环中正确随机化'

Python—转换日期:价目表到新行

找到相对于列表索引的当前最大值列表""

PYTHON、VLC、RTSP.屏幕截图不起作用

如何在Python中使用Iscolc迭代器实现观察者模式?

根据客户端是否正在传输响应来更改基于Flask的API的行为

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上

Polars表达式无法访问中间列创建表达式

文本溢出了Kivy的视区

对包含JSON列的DataFrame进行分组

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

当lambda函数作为参数传递时,pyo3执行

如何计算Pandas 中具有特定条件的行之间的天差