簡體   English   中英

c語言中浮點數四舍五入背后的邏輯是什么?

[英]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.

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