9.1 浮點數型態:float、double、long double
浮點數是 C++ 的基本資料型態之一,專門儲存「有小數點的數」。共有三種:
| 型態 | 總位元數 | 組成(正負號+指數+尾數) | 競程評價 |
|---|---|---|---|
float |
32 | 1 + 8 + 23 | ✗ 精度太低,不要用 |
double |
64 | 1 + 11 + 52 | ✓ 預設選它 |
long double |
平台而定(本站為 x86 延伸精度 80 位元) | 1 + 15 + 64 | 需要更高精度時的救兵 |
「指數」和「尾數」是什麼意思,9.5 會拆給你看。先把表格裡的「精度」和這個單元從頭用到尾的三個詞講清楚:
- 有效數字(也常說「有效位數」):從左邊第一個不是 0 的數字開始數,一個數共寫了幾位數字。1.44 有 3 位、123456.7 有 7 位;0.000123 也是 3 位——開頭那串 0 只是佔位用的,不算。
- 誤差:存進電腦的值(或算出來的值)跟真正的值之間差了多少。浮點數存小數常常只能「差不多準」,差掉的那一點點就是誤差。
- 精度:能保證多少位有效數字是可信的。精度越高=可信的位數越多=誤差越小。
有了這三個詞,就能看懂表格的競程評價:
¶範例程式碼
浮點數的讀入輸出跟整數長得一模一樣——換個型態名稱就好。輸入正方形的邊長,輸出面積:
#include <iostream>
using namespace std;
int main() {
double d;
cin >> d;
cout << d * d << '\n';
return 0;
}
拿三組輸入各跑一次,觀察輸出:
| 輸入 | 輸出 | 手算的正確答案 |
|---|---|---|
1.2 |
1.44 |
1.44 ✓ |
1001 |
1.002e+06 |
1002001……? |
0.003 |
9e-06 |
0.000009……? |
第一組正常,後兩組印出了 e+06、e-06 這種東西——而且 1.002e+06 看起來還把 1002001 的尾巴弄丟了。這是怎麼回事?下一節解密。
動手試試看:把範例改成讀入長方形的長和寬(兩個 double),輸出面積。輸入 1.5 2.5 應印出 3.75;再輸入 3 2 試試——面積明明是 6.0,印出來卻是不帶小數點的 6。把這個現象也帶著,下一節一起解密。