浮点数不能按预期工作

时间:2011-09-08 15:26:43

标签: c floating-point

在下面的代码中,当我输入为1 10 2 1 2 2时,sum打印为52,sum3打印为31.200001,而它的输入为31.200000

int main(){

    int t,n,i,a[2000],m,j,f;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        scanf("%d",&f);
        for(i=0;i<f;i++){
            scanf("%d",&a[i]);
        }
        scanf("%d",&m);
        if(n!=0){
            int sum=n*(n+1)/2;
            int sum2=0;
            for(j=0;j<i;j++){
                sum2+=a[j];
            }
            sum-=sum2;
            printf("%d\n",sum);
            float sum3;
            if(n%2==0) sum3=(1.0-2.0*m/n)*sum;
            else sum3=(1.0-2.0*m/(n+1))*sum;
            printf("%f\n",sum3);
        }
        else printf("0.0000\n");
    }
    return 0;
}

6 个答案:

答案 0 :(得分:5)

来自the Floating-Point Guide

  

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且   相反,我得到一个奇怪的结果,如0.30000000000000004?

     

因为在内部,计算机使用格式(二进制浮点)   它不能准确地表示0.1,0.2或0.3之类的数字。

     

编译或解释代码时,您的“0.1”已经存在   四舍五入到该格式的最接近的数字,这导致一个小的   甚至在计算发生之前就会出现舍入错误。

答案 1 :(得分:2)

十进制数31.2不能表示为二进制分数。更具体地说,类型float的最近值是31.200000762939453125,正好是8178893 * 2 -18

如果您需要一个更接近小数31.2的数字,请考虑使用类型double,其结果为31.199999999999999289457264239899814128875732421875或8782019273372467 * 2 -48 < / p>

答案 2 :(得分:0)

这是float的性质。它们不能保证完全准确。

有关如何/为何如此的详细信息,请参阅here

答案 3 :(得分:0)

31.2不是二进制浮点数中的可表示数字。无论用什么计算来产生它,你都不会得到一个完全等于31.2的浮点数。你得到的答案与你可以合理预期的一样好。

答案 4 :(得分:0)

..但你可以尝试减少这种可能性。你需要考虑加法/减法的指数等等。

答案 5 :(得分:0)

你可以使用     printf("%g\n",sum3); 代替     printf("%f\n",sum3); 在你的代码中获得正确的输出..

我希望它能奏效。