嗯,我正在尝试使用两种不同的方法对向量求和。结果应该相同,但是不会发生。
[方法1:矢量以线性方式求和;
方法2:将向量分为两部分;
下面显示代码:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i,n;
double a,b,c;
a=0;
b=0;
c=0;
n=1000000;
//Initialization
double vec[n];
for(i=0;i<n;i++)
{
vec[i]=1.0001;
}
//Sum Method 1
for(i=0;i<n;i++)
{
a+=vec[i];
}
//Sum Method 2
for(i=0;i<n/2;i++)
{
b+=vec[i];
}
for(i=n/2;i<n;i++)
{
c+=vec[i];
}
b=c+b;
//------------------------------------
printf("Method 1: %.30f\n",a);
printf("Method 2: %.30f\n",b);
return 0;
}
输出为:
Method 1: 1000099.999976676190271973609924316406
Method 2: 1000100.000003988854587078094482421875
有什么办法解决这个问题?
浮点加法没有关联。在第一个中,您加起来像:(((x1 + x2)+ x3)+ x4)。在第二个类似(x1 + x2)+(x3 + x4)中。