首页 > 解决方案 > 不同的结果对相同的和(C语言)(四舍五入问题)

问题描述

好吧,我正在尝试使用两种不同的方法对向量求和。结果应该是相同的,但不会发生。

方法一:对向量进行线性求和;

方法二:向量两部分相加;

代码如下:

#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

有没有办法解决这个问题?

标签: cvectorsumdouble

解决方案


浮点加法不是关联的。在第一个中,您加起来如下:(((x1 + x2) + x3) + x4)。而在第二个像(x1 + x2)+(x3 + x4)。


推荐阅读