我知道类似的精度问题在这里也有人问过,但是我正在阅读一个项目的代码,这个项目是在浮点之间做一个精确的平等比较,这让我很困惑。
假设 x1
和 x2
属于 numpy.ndarray
和d型 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)
).
如果不使用并行性或者并行性的构造是合适的,比如总是将一个作业分割成相同的片段,并以相同的方式组合它们的结果,而不管计算完成的顺序如何,那么获得相同的结果就不足为奇了。
妨碍可重复性的一些因素包括:不同的并行性、使用不同的数学库(对诸如 "DSP "等函数的实现不同)。pow
),以及使用对浮点运算不严格的语言(比如允许但不要求额外的精度)。