看板 C_and_CPP 關於我們 聯絡資訊
爬過文發現這問題還漫多人問的,但看過之後還是不太懂我的問題該如何解 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
wowtiger:去看 IEEE 754 的規則吧 05/05 01:14
wowtiger:應該是 512 * ( 1 + 15990784 / 16777216 ) 05/05 01:17
MOONRAKER:阿你不給printf指定位數,像%10.6f之類的,他當然給你進 05/05 02:19
VictorTom:IEEE754浮點數表示法的精確度問題, 去查spec吧.... 05/05 09:29
VictorTom:簡單說, float 32 bits/double 64 bits能夠表達的bit 01 05/05 09:30
VictorTom:變化有限, 怎麼可能讓你把所有浮點數都精確的記錄下來:) 05/05 09:31