2010-08-27 107 views
0

我想添加一個int到一個浮點數。我的代碼是:鑄造int作爲浮點數

int main() { 
    char paus[2]; 
    int millit = 5085840; 
    float dmillit = .000005; 
    float dbuffer; 

    printf("(float)milit + dmillit: %f\n",(float)millit + dmillit); 
    dbuffer = (float)millit + dmillit; 
    printf("dbuffer: %f\n",dbuffer); 

    fgets(paus,2,stdin); 
    return 0; 
} 

輸出看起來像:

(浮動)millit + dmillit:5085840.000005
dbuffer中:5085840.000000

爲什麼是有區別嗎?我也注意到,如果我改變dmillit = .5,那麼兩個輸出是相同的(5085840.5),這是我所期望的。爲什麼是這樣?謝謝!

+0

http://stackoverflow.com/questions/1907114/integers-and-float-precision – 2010-08-27 19:58:38

+0

float的可能重複只有double的精度的一半,甚至double可以不如「浮點」寄存器精確。如果你正在做「浮點」計算,通常最好使用double而不是float(除非你有一些奇怪的空間要求)。 – 2010-08-27 21:53:00

+0

要指出(有點)顯而易見的,'float'只有大約7位數的精度。你的整數已經把所有的東西都浸透了,所以在小數點後面沒有任何剩餘部分來表示六個地方。換個角度看,'dbuffer'也得到了你所告訴的結果,並具有你允許的所有精度。 – RBerteig 2010-08-28 08:13:59

回答

4

您嘗試使用的精度對於浮點數而言太大。在printf功能上,它被鑄造成雙面打印。

請參閱頁面IEEE 754 float calculator以更好地理解這一點。

+4

關於它可能沒有「可能」。你不能將'float'傳遞給像'printf()'這樣的可變參數。它會自動升級爲「雙」。 – 2010-08-27 19:27:55

+0

啊,好吧,這是有道理的。並感謝您的鏈接,我發現該網站之前,但不記得在哪裏,並一直在尋找。謝謝! – Jade 2010-08-27 19:34:15

+0

謝謝@David。不知道是否確實如此。編輯答案。 – korbes 2010-08-27 20:30:02

7

(float)millit + dmillit評估爲double value。當您打印該值時,它會正確顯示,但是當您將其存儲在浮點型變量中時,精度會丟失。

1

我相信printf語句中的浮點加法可能會默默地將結果轉換爲double,所以它具有更高的精度。

+2

看一下C99草案標準,對於一個實現來說''float'加法類型'double'是可以的,它當然必須作爲'double'來傳遞。 – 2010-08-27 19:30:30

1
printf("(float)milit + dmillit: %f\n",(float)millit + dmillit); 

我相信在這裏,加法是作爲double來完成的,並且作爲double傳遞給printf。

dbuffer = (float)millit + dmillit;  
printf("dbuffer: %f\n",dbuffer); 

這裏的加法爲雙做,然後還原成一個浮點數存儲在dbuffer中,然後擴大回雙傳遞給printf。