簡體   English   中英

浮點數不能按預期工作

[英]Floating point numbers do not work as expected

在下面的代碼中,當我將輸入值設為1 10 2 1 2 2時,sum被打印為52,sum3被打印為31.200001,而shld為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;
}

浮點指南

為什么我的數字(例如0.1 + 0.2)加起來不是一輪好0.3,而是得到一個像0.30000000000000004這樣的怪異結果?

因為在內部,計算機使用的格式(二進制浮點數)根本無法准確表示一個數字,例如0.1、0.2或0.3。

編譯或解釋代碼時,“ 0.1”已經舍入為該格式的最接近的數字,即使在計算之前,也會產生小的舍入誤差。

十進制數31.2不能表示為二進制分數。 更具體地說, float類型的最接近值為31.200000762939453125 ,正好是8178893 * 2 -18

如果您需要一個更接近小數點31.2的數字,請考慮使用double類型,其結果將是31.199999999999999289457264239899814128875732421875或8782019273372467 * 2 -48

您可以使用printf("%g\\n",sum3); 而不是printf("%f\\n",sum3); 在您的代碼中以獲取正確的輸出。

我希望它能起作用。

這是float的本質。 不保證它們是完全准確的。

有關情況的原因,請參見此處

31.2在二進制浮點數中不是可表示的數字。 無論使用哪種計算來產生浮點數,您都永遠不會獲得完全等於31.2的浮點數。 您得到的答案與您合理預期的一樣好。

..但是您可以嘗試減少這種可能性。 您需要考慮用於加/減的指數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM