我正在读一本书并陷入困境。我坚持下面这里,想知道x +(y + z)= 0.0的计算方法?
此外,在下面的高斯消除方法示例中,我无法得到如何计算2.5 /( - 0.005)= - 2500?他们从这里获得了“-0.005”的价值。
答案 0 :(得分:3)
计算机不像人们在纸笔上那样进行算术运算。数字的精确度有限。想象一下,你有一个数字系统,你的小数点后面只有4位数,而且功率因数也是10,所以数字看起来像:
±0._ _ _ _ × 10ⁿ
现在,添加以下两个数字:
0.1234 × 10⁸
0.5678 × 10⁰
您正在添加
12340000
和
00000000.5678
真正的总和是
12340000.5678,
但这里的理论计算机只能存储前四位,给出
12340000 = 0.1234 × 10⁸
这就是教科书问题中的y+z
等于y
和x + (y + z) = 0 ≠ (x + y) + z
的原因。
x = 0.1 × 10¹⁰
y = -0.1 × 10¹⁰
z = 0.1 × 10¹
x + y = 0.0
(x + y) + z = 0.0 + 0.1 × 10¹ = 0.1 × 10¹
(单精度)浮点数在IEEE算法中只有8位精度。这些对应于C float
数据类型。但是,当您添加y = - 10⁹ z
和z
时,y
和z
会消失。所以,
y + z = -999999999 = -0.1 × 10¹⁰ after rounding.
x + ( y + z) = 0.0
这本书也有印刷错误。商应该是2.5/(-0.001)
,来自矩阵的第2行和第3行。
这就是为什么矩阵代数的计算机算法很棘手;他们寻求最小化舍入误差和下溢的影响。不幸的是,算法中的任何缺陷都可能导致非常糟糕的问题。一个测试是查看希尔伯特矩阵
H_n = (1/(i+j-1)) 1 ≤ i, j ≤ n
此矩阵的逆矩阵具有整数条目,但该矩阵及其逆矩阵非常恶劣。计算逆的任何数值误差都会导致极其错误的值。二十年前,我测试了当时版本的Matlab的逆例程。对于H_10来说这是可以接受的,但是对于H_12来说太差了。