python / numpy中的浮点数学无法在所有计算机上重现

乌尔斯

比较几个不同机器上的浮点计算结果,它们始终产生不同的结果。这是一个重现该行为的精简示例:

import numpy as np
from numpy.random import randn as rand

M = 1024
N = 2048
np.random.seed(0)

a = rand(M,N).astype(dtype=np.float32)
w = rand(N,M).astype(dtype=np.float32)

b = np.dot(a, w)
for i in range(10):
    b = b + np.dot(b, a)[:, :1024]
    np.divide(b, 100., out=b)

print b[0,:3]

不同的机器产生不同的结果,例如

  • (-2.85753540e-05 -5.94204867e-05 -2.62337649e-04)
  • (-2.85751412e-05 -5.94208468e-05 -2.62336689e-04)
  • (-2.85754559e-05 -5.94202756e-05 -2.62337562e-04)

但是我也可以得到相同的结果,例如通过在同一年份的两台MacBook上运行。使用具有相同版本的Python和numpy,但不一定要链接到相同的BLAS库的机器(例如Mac上的加速框架,Ubuntu上的OpenBLAS)会发生这种情况。但是,难道不同的数字库不都应符合相同的IEEE浮点标准并给出完全相同的结果吗?

阿力克

浮点计算并不总是可重复的。

可以,如果你使用相同的可执行映像,输入,与相同的编译器和相同的编译器设置(开关)建库获得可重复的结果在不同的机器浮动计算。

但是,由于多种原因,如果您使用动态链接库,则可能会得到不同的结果。首先,正如Veedrac在评论中指出的那样,它在不同体系结构上的例程可能使用不同的算法。其次,编译器可能会根据开关(不同的优化,控制设置)产生不同的代码。甚至a+b+c会在机器和编译器之间产生不确定的结果,因为我们不能确定评估顺序,中间计算的精度。

在这里阅读为什么不能保证在不同的IEEE 754-1985实现上获得相同的结果新标准(IEEE 754-2008)试图走得更远,但仍不能保证不同实现之间的结果相同,因为例如,它允许实现者选择何时检测到微小(下溢异常)

有关浮点确定性的更多信息,请参见本文

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python,将所有浮点数打印到输出中的小数点后两位

在Python中,如何将列表中的所有项目都转换为浮点数?

Python中的JavaScript toString(16)是否有浮点数?

带有浮点数的Python xrange

64位Python中的32位浮点数学

如何在python中反转numpy浮点数列表的列表的每个元素?

计算python中范围之间的列表中的浮点数

Python计算阶乘,OverflowError:int太大,无法转换为浮点数

Python C ++浮点数学表示错误

如何在Python中将numpy转换为浮点数

如何在python keras中的张量上计算浮点数的熵

在python列表中查找浮点数

使用pyinstaller在Linux中创建python可执行文件,无法在Windows计算机上运行

如何在无法安装所需软件包的计算机上运行python脚本?

在python中乘以浮点数

在Python中添加浮点数

无法在我的计算机中的所有位置运行的exe的Python文件仅在python安装中的dist文件夹中有效

python seqdiag文件很大,无法在其他计算机上打开?

如何计算浮点数的Python浮点数的根

在Chrome中删除人会在所有计算机上将其删除吗?

从 Python 文件中读取浮点数

我无法在 python 部门中获得浮点数

Python(熊猫):如何将DataFrame中的所有浮点数乘以常数

Python 从字符串中提取所有整数和浮点数

python:将numpy数组转换为固定浮点数

无法使用 selenium 和 Python 将 PDF 从计算机上传到网络

嗨,我是 Python 3 的新手,并希望在列表中同时包含浮点数和字符串的列表中计算浮点数

替换python中的小浮点数

如何使用 Python 舍入文本文件中的所有浮点数