我在Matlab中有两个向量,z
和beta
。向量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
的点积,我可能会得到两个不同的解决方案。如果我使用*
命令,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或10左右,而有几个条目的数量级为10^26或10^27。在这种情况下,数值问题几乎不可避免。
维基百科页面http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems显示了一个工作示例,其中(a + b) + c
不等于a + (b + c)
,即表明您添加浮点数的顺序是重要的。
我猜这是为了说明这些问题而设计的家庭作业。如果不是,我会询问数据代表什么,以找出适当的方法。首先找出为什么会产生这么大的数字,可能比试图弄清楚包含它们的点积的意义要有效得多。