【发布时间】:2017-09-13 04:51:54
【问题描述】:
有人知道这种行为的文档吗?
import numpy as np
A = np.random.uniform(0,1,(10,5))
w = np.ones(5)
Aw = A*w
Sym1 = Aw.dot(Aw.T)
Sym2 = (A*w).dot((A*w).T)
diff = Sym1 - Sym2
diff.max() 接近机器精度非零,例如4.4e-16.
这(与 0 的差异)通常很好......在有限精度的世界中,我们不应该感到惊讶。
此外,我猜 numpy 对对称产品很聪明,以节省失败并确保对称输出......
但我处理的是混沌系统,并且当调试时,这个小差异很快就会变得明显。所以我想知道到底发生了什么。
【问题讨论】:
-
由于您的代码会在每次运行时提供不同的输出,请显示一个示例输出并更清楚地说明该输出的不良之处。
-
您是否尝试强制使用双精度数 (
np.float64)? -
@TomdeGeus 怎么样?无论如何,请注意,我并不真正关心差异是非零的。我只想解释这种行为(这显然来自 numpy 的聪明)。
-
您可以在
A和w的定义上使用.astype(np.float64)。顺便说一句,根据 NumPy,我机器上的机器精度是print(np.finfo(np.float64).eps)= 2.2e-16。而diff.max()= 1.1e-16,即在机器精度范围内。 -
使用
B=Aw.T.copy()有什么区别?
标签: python numpy floating-point linear-algebra floating-accuracy