gpt4 book ai didi

python - 机器 epsilon 的倍数是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:06 24 4
gpt4 key购买 nike

我正在尝试调查矩阵方程问题 (Ax=b) 的残差来源。为了验证我的答案,我减去 Ax-b,期望 0。我获得的值与机器 epsilon 的数量级相同,而不是“纯”零,这很好。问题是,这些残差似乎是彼此的倍数,所以我不确定如何解释它们。

我在这里找到了一些细节:Machine epsilon computation issue ,这并没有阐明为什么出现 epsilon 的倍数而不是一个或另一个。

我使用 np.finfo(float).eps 检查了我的系统,它生成了 2.220446049250313e-16。我在解 x 中得到的残差之一与此值相同,但是,另一个残差似乎是 epsilon 的一半。

这是我使用的代码:

# Arbitrary Matrix A and Vector b
A = np.array([[2,-1,0],[1,-2,1],[0,-1,2]])
b = np.array([[1],[0],[1]])

# Solve for Vector x
x = np.linalg.solve(A,b)

# Calculate difference, expected to be column of zeros
diff = A.dot(x) - b
print(diff)

这是输出:

Output: 
[[ 0.00000000e+00]
[-1.11022302e-16] #-------> Is this machine epsilon...
[-2.22044605e-16]] #-------> ...or this?

对此的解释/解释是什么?我知道仍然可以表示小于 epsilon 的值,但在那种情况下为什么不是两个残差 -1.11022302e-16

提前致谢!

最佳答案

所谓机器epsilon就是1处的最小精度单位(ULP),即1的表示中最低有效位的位置值。当有效位有53位时, 1用二进制数1.000…0002表示,二进制小数点后有52个0。所以最低位的位置值为2−52,2−52就是1的ULP。

一般来说,让 ULP(x) 代表 x 的最小精度单位。通常,浮点格式将数字表示为 (−1)sfbe,其中 b 是固定基数(二进制格式为 2,十进制为 10,十六进制为 16),s 是符号位(0 代表 +,1 代表 −),e 是指数,fp 位的尾数,其中 p 是格式的固定数量。对于 IEEE-754 binary32,p 为 53,即 53 位。 ULP 是由指数缩放的尾数中最低精度的位置值,因此,如果某个数 x 以带符号位的浮点格式表示 s,尾数f,指数e,其ULP为b1−pbe。 (我假设有效数的格式是小数点之前的基数 -b 数字和小数点之后的 p-1 数字,这就是为什么它的最低数字具有b1−p的位置值。此类有效数在区间[1, b)中。有时有效数的比例不同,指数会进行调整以进行补偿。例如,它可能在证明有效数字是整数时很有用。)

在二进制格式中,ULP(2) = 2•ULP(1)、ULP(½) = ½•ULP(1)、ULP(¼) = ¼•ULP(1),依此类推。

假设您已经计算了区间 [1, 2) 中的两个值,如果使用实数算法计算,这两个值将相等,但它们是使用浮点算法计算的,并且碰巧略有不同。由于表示的格式,它们只能相差 ULP(1) 的倍数。当您减去这些数字时,您通常会得到 0、ULP(1)、2•ULP(1) 或 ULP(1) 的其他倍数,具体取决于具体情况。如果用浮点运算计算用实数算法计算的两个数字是相同的,则它们在计算的各个部分可能会遇到不同的舍入误差。

如果您计算区间 [½, 1) 中的两个值,它们只能相差 ULP(½) 的倍数。

这就是为什么您会看到 ULP(1) 的各种倍数或二进制分数。它只是浮点格式量化的产物。

关于python - 机器 epsilon 的倍数是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com