Numpy array_equal 和 float 精确相等检查
Numpy array_equal and float exact equality check
我知道这里已经问过类似的精度问题,但是我正在阅读一个项目的代码,该项目正在对浮点数进行精确的相等比较,这让我感到困惑。
假设 x1
和 x2
是类型 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
),以及使用对浮点计算不严格的语言(例如允许,但不需要额外的精度)。
我知道这里已经问过类似的精度问题,但是我正在阅读一个项目的代码,该项目正在对浮点数进行精确的相等比较,这让我感到困惑。
假设 x1
和 x2
是类型 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
),以及使用对浮点计算不严格的语言(例如允许,但不需要额外的精度)。