[英]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);
在您的代碼中以獲取正確的輸出。
我希望它能起作用。
31.2在二進制浮點數中不是可表示的數字。 無論使用哪種計算來產生浮點數,您都永遠不會獲得完全等於31.2的浮點數。 您得到的答案與您合理預期的一樣好。
..但是您可以嘗試減少這種可能性。 您需要考慮用於加/減的指數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.