Numpy array_equal 和 float 精确相等性检查

Numpy array_equal and float exact equality check

提问人:mgus 提问时间:6/2/2020 更新时间:6/2/2020 访问量:334

问:

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

假设 和 的类型和 dtype 。这两个变量是由对相同数据执行的相同代码计算的,但已由一台计算机和另一台计算机计算(这是在与 MPI 通信的 AWS 集群上完成的)。x1x2numpy.ndarraynp.float32x1x2

然后比较这些值如下

numpy.array_equal(x1, x2)

因此,完全相等(无容忍)对于该程序的工作至关重要,并且似乎工作正常。这让我感到困惑。如何比较在不同机器上计算的两个结果,而不会遇到精度问题?什么时候这两个(或更多)浮点数可以相等?np.float32

python numpy 浮点 精度 相等

评论

2赞 user2357112 6/2/2020
浮点舍入误差不是随机的。它对很多微妙的事情都很敏感,包括执行顺序、硬件、并行算法的线程调度、编译器设置、矢量化指令的使用等,但它不是随机的。获得可重复的结果很困难,但有可能。
0赞 user2357112 6/2/2020
在集群中的机器上,很多东西可能已经是相同的,但这并不意味着在下一次软件更新或硬件更改后,你的结果将是可重现的,或者如果你引入更细粒度的并行性,你会得到可重现的结果。

答:

1赞 Eric Postpischil 6/2/2020 #1

IEEE-754 指定的算术是确定性的,考虑到其第 11 条(2008 年版)中讨论的某些约束,包括表达式计算的合适规则(例如从编程语言中的表达式到 IEEE-754 操作的明确转换,例如必须给出 、 不)。a+b+c(a+b)+ca+(b+c)

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

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