点积:*命令与循环给出不同的结果

时间:2013-04-24 20:12:34

标签: matlab floating-point floating-accuracy dot-product

我在Matlab中有两个向量,zbeta。向量z是1x17:

1 0.430742139435890 0.257372971229541 0.0965909090909091 0.694329541928697 0 0.394960106863064 0 0.100000000000000 1 0.264704325268675 0.387774594078319 0.269207605609567 0.472226643323253 0.750000000000000 0.513121013402805 0.697062571025173

... beta是17x1:

6.55269487769363e+26 0 0 -56.3867588816768 -2.21310778926413 0 57.0726052009847 0 3.47223691057151e+27 -1.00249317882651e+27 3.38202232046686 1.16425987969027 0.229504956512063 -0.314243264212449 -0.257394312588330 0.498644243389556 -0.852510642195370

我正在处理一些奇点问题,我注意到如果我想计算z*beta的点积,我可能得到2个不同的解决方案。如果我使用*命令z*beta = 18.5045。如果我写一个循环来计算点积(下图),我得到一个0.7287的解。

summation=0;
for i=1:17
    addition=z(1,i)*beta(i);
    summation=summation+addition;
end

知道这里发生了什么吗?

以下是数据的链接:https://dl.dropboxusercontent.com/u/16594701/data.zip

1 个答案:

答案 0 :(得分:7)

这里的问题是浮点数的添加是非关联。在对可比较数量的数字序列求和时,这通常不是问题。但是,在您的序列中,大多数数字大约为1或10,而有些条目的大小为10 ^ 26或10 ^ 27。在这种情况下,数值问题几乎是不可避免的。

维基百科页面http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems显示了(a + b) + c不等于a + (b + c)的工作示例,即证明您添加浮点数的顺序很重要。

我猜这是一个家庭作业,旨在说明这些确切的问题。如果没有,我会问这些数据代表什么,以便采取适当的方法。找出为什么这么大的数字首先被生产出来而不是试图弄清楚包含它们的点数产品可能会更有成效。