-2

我正在读一本书,并被困在一个特定的点上。我在下面停留在这里,想知道 x+(y+z)=0.0 是如何计算的? 在此处输入图像描述

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

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

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 位精度。这些对应于 Cfloat数据类型。但是,当您添加and时y = - 10⁹ z,andz会消失。所以, yz

y + z = -999999999 = -0.1 × 10¹⁰ after rounding.
x + ( y + z) = 0.0  

这本书还有一个印刷错误。2.5/(-0.001)从矩阵的第 2 行和第 3 行开始,商应该是第 2 列。

这就是为什么矩阵代数的计算机算法很棘手的原因。他们寻求最小化舍入误差和下溢的影响。不幸的是,算法中的任何缺陷都可能导致非常糟糕的问题。一项测试是查看希尔伯特矩阵

H_n = (1/(i+j-1))     1 ≤ i, j ≤ n 

该矩阵的逆矩阵具有整数项,但该矩阵及其逆矩阵非常病态。计算倒数时的任何数值错误都会导致非常错误的值。二十年前,我为当时的 Matlab 版本测试了逆例程。对于 H_10 来说是可以接受的,但对于 H_12 来说太差了。

于 2013-06-13T12:58:20.217 回答