基本高斯消除产生错误的结果?

时间:2013-06-13 12:43:23

标签: error-handling

我正在读一本书并陷入困境。我坚持下面这里,想知道x +(y + z)= 0.0的计算方法? enter image description here

此外,在下面的高斯消除方法示例中,我无法得到如何计算2.5 /( - 0.005)= - 2500?他们从这里获得了“-0.005”的价值。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

计算机不像人们在纸笔上那样进行算术运算。数字的精确度有限。想象一下,你有一个数字系统,你的小数点后面只有4位数,而且功率因数也是10,所以数字看起来像:

±0._ _ _ _ × 10ⁿ

现在,添加以下两个数字:

 0.1234 × 10⁸
 0.5678 × 10⁰

您正在添加

12340000

00000000.5678

真正的总和是

12340000.5678,

但这里的理论计算机只能存储前四位,给出

12340000 = 0.1234 × 10⁸

这就是教科书问题中的y+z等于yx + (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⁹ zz时,yz会消失。所以,

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来说太差了。