[英]What logic works behind the rounding off of floating point number in c language?
我用c語言編寫了一個程序來四舍五入浮點數,但程序的輸出不遵循任何邏輯。 代碼是-->
#include<stdio.h>
int main(){
float a=2.435000;
float b=2.535000;
float c=2.635000;
float d=2.735000;
float e=2.835000;
//Rounding off the floating point numbers to 2 decimal places
printf("%f %.2f\n",a,a);
printf("%f %.2f\n",b,b);
printf("%f %.2f\n",c,c);
printf("%f %.2f\n",d,d);
printf("%f %.2f\n",e,e);
return 0;
}
輸出:
2.435000 2.43
2.535000 2.54
2.635000 2.63
2.735000 2.73
2.835000 2.84
所有浮點數都具有相同的數字模式,即它們采用 2.x35000 的形式,其中 x 在不同數字中不同。 我不明白為什么他們在四舍五入時表現出不同的行為,他們應該給出 2.x3 或 2.x4,但對於不同的 x,它給出不同的值。
這背后的邏輯是什么?
在你我看來,2.435 是一個不錯的整數小數。
在你我看來,如果我們把它四舍五入到兩個地方,我們會得到 2.44。
但是大多數計算機內部不使用小數,而你我使用的絕對不使用小數。 他們使用二進制分數,而二進制分數可能會令人驚訝。
在內部,事實證明數字 2.435 不能用二進制精確表示。 作為float
,它在內部表示為二進制分數,相當於 2.434999942779541015625。 這非常接近 2.435,但是您可以看到,如果將其四舍五入到兩個位置,則會得到 2.43。
同樣的論證解釋了你的其他結果。 2.635 實際上是 2.6349999904632568359375,所以它四舍五入到 2.63。 但是 2.535 是 2.5350000858306884765625,所以它四舍五入到 2.54,正如你所期望的。
為什么我們不能接近,比如說,2.435? 正如我所說,在內部它是一個相當於 2.434999942779541015625 的二進制小數。 實際的IEEE-754 單精度表示是0x401bd70a
,結果為0x0.9bd70a × 2²
,或 0.60874998569488525390625 × 2 2 。 但是,如果我們“加1”來了,那就是,如果我們把它最小的有點大了,我們就可以了,接下來的float
值是0x401bd70b
,這是0x0.9bd70b
或0.608750045299530029296875×2 2,這是2.4350001811981201171875,從而結束了離 2.435 有點遠。 (實際上是三倍多。第一個數字相差 0.000000057;第二個數字相差 0.000000181。)
您可以在這些其他“規范”SO 問題中閱讀有關二進制浮點數有時令人驚訝的屬性的更多信息:
關於他們的另外兩個有趣的問題——就在過去幾天——是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.