[問題] 關於float跟double的問題

看板C_and_CPP (C/C++)作者 (小馬非馬)時間16年前 (2009/05/05 00:23), 編輯推噓2(204)
留言6則, 3人參與, 最新討論串1/1
爬過文發現這問題還漫多人問的,但看過之後還是不太懂我的問題該如何解 ex.1 #include<iostream> int main() { float num=999.999999; printf("%f\n",num); double num2=999.999999; printf("%lf\n",num2); system("pause"); } 執行結果:1000.000000 999.999999 1.為什麼float的輸出會進位成1000.000000?而double的不會 〈我想是溢位的問題,因為double再多打幾個9也會進位,不過有人跟我說是因為 printf會將太小的數自動進位〉 如果是溢位問題,那如何得知可以打到小數以下第幾位? 〈記得float可以打到第六位,double是十幾位,但我才打到這些標準的前面幾位就 不行了〉 如果是太小被自動進位,那是多小會做這動作? 2. ex.2 #include<iostream> int main() { float num=999.999; printf("%f\n",num); double num2=999.999; printf("%lf\n",num2); system("pause"); } 執行結果:999.999023 999.999000 把小數以下改成到第三位,float輸出後面多了怪怪的數字,是因為0.999用2的負n 次方去逼近所產生的問題嗎?可是為什麼double就沒這問題? 3. 其實我不是很懂printf跟cout的差別,關於用cout去執行 第一個例子結果是 執行結果:1000 1000 第二個例子結果是 執行結果:999.999 999.999 為什麼會不一樣? ================== 不好意思問題這麼多麻煩大家看完,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.134.160

05/05 01:14, , 1F
去看 IEEE 754 的規則吧
05/05 01:14, 1F

05/05 01:17, , 2F
應該是 512 * ( 1 + 15990784 / 16777216 )
05/05 01:17, 2F

05/05 02:19, , 3F
阿你不給printf指定位數,像%10.6f之類的,他當然給你進
05/05 02:19, 3F

05/05 09:29, , 4F
IEEE754浮點數表示法的精確度問題, 去查spec吧....
05/05 09:29, 4F

05/05 09:30, , 5F
簡單說, float 32 bits/double 64 bits能夠表達的bit 01
05/05 09:30, 5F

05/05 09:31, , 6F
變化有限, 怎麼可能讓你把所有浮點數都精確的記錄下來:)
05/05 09:31, 6F
文章代碼(AID): #19_nQGCc (C_and_CPP)
文章代碼(AID): #19_nQGCc (C_and_CPP)