2017-08-16 108 views
0
#include <stdio.h> 

int main() { 
float k; 
    scanf("%f", &k); 
    printf("%f", k); 
} 

在這個簡單的程序中,當我輸入一個最多包含8位數字的數字時,它會正確顯示。爲什麼scanf爲大浮點數輸入錯誤的輸入?

但是,如果我超過了8位,即對於輸入123456789輸出是123456792

爲什麼會發生這種情況?那麼有趣的是,如果我在123456789123456796之間輸入任何數字,那麼它總是會顯示123456792

是否與浮點數的8位小數精度有關?

+1

https://stackoverflow.com/questions/12560291/set-back-default-precision-c –

+4

@HariomSingh鏈接的問題是如何相關的?甚至沒有相同的語言。 – Toby

+0

@Toby問題最初是用[tag:C++]進行雙重標記的,將其刪除,因爲代碼和文本都沒有引用C++。 –

回答

5

浮點類型的精度有限。對於機器上的float,它似乎是32位,它具有24位精度(23個明確存儲,1個隱含位)。這意味着大於〜16000000的整數,需要超過24位來存儲,不能完全用這個數據類型表示。

例如,使用的值123456789具有的二進制表示:

111 0101 1011 1100 1101 0001 0101 

此值佔用27位,它們是大於可用。因此,它被四捨五入爲可存儲與23位,這是123456792.在二進制最接近的值:

111 0101 1011 1100 1101 0001 1000 

對於這個值,具有0值的下3位未明確存儲。

+0

關閉1:約16000000正好,但典型的「浮點」有24位精度。 23個是直接編碼的,1個是隱含的。首先將一個整數轉換爲「float」,這是16,777,217(0x1000001),一個25位整數。 – chux

+1

@chux好的。更新以反映。 – dbush