語法書 / AA 競程語法書 下冊 / 第九單元 / 浮點數型態:float、double、long double

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.443 位、123456.77 位;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+06e-06 這種東西——而且 1.002e+06 看起來還把 1002001 的尾巴弄丟了。這是怎麼回事?下一節解密。

動手試試看:把範例改成讀入長方形的長和寬(兩個 double),輸出面積。輸入 1.5 2.5 應印出 3.75;再輸入 3 2 試試——面積明明是 6.0,印出來卻是不帶小數點的 6。把這個現象也帶著,下一節一起解密。