Numpy array_equal 和 float 精确相等检查

Numpy array_equal and float exact equality check

我知道这里已经问过类似的精度问题,但是我正在阅读一个项目的代码,该项目正在对浮点数进行精确的相等比较,这让我感到困惑。

假设 x1x2 是类型 numpy.ndarray 和数据类型 np.float32。这两个变量是通过对相同数据执行的相同代码计算的,但是 x1 是由一台机器计算的,而 x2 是由另一台机器计算的(这是在与 MPI 通信的 AWS 集群上完成的)。

然后数值比较如下

numpy.array_equal(x1, x2)

因此,完全相等(无公差)对于该程序的运行至关重要,而且它似乎运行良好。这让我很困惑。如何比较在不同机器上计算的两个 np.float32 而不会遇到精度问题?这两个(或更多)浮点数什么时候可以相等?

IEEE-754 指定的算法在其第 11 条(2008 年版)中讨论的某些约束下是确定性的,包括表达式评估的适当规则(例如从编程语言中的表达式到 IEEE-754 操作的明确翻译,比如a+b+c一定要给(a+b)+c,不能给a+(b+c)).

如果没有使用或适当地构建并行性,例如总是将一个作业分成相同的部分,并以相同的方式组合它们的结果,而不管计算完成的顺序如何,那么获得相同的结果就不足为奇了。

一些阻碍再现性的因素包括不同的并行性、使用不同的数学库(具有不同的函数实现,例如 pow),以及使用对浮点计算不严格的语言(例如允许,但不需要额外的精度)。