C 語言 double 型別完整解析
基本定義
double (雙精度浮點數) 是 C 語言基本資料型別之一,用於儲存**帶小數點的實數**,精度與範圍均優於 float。
型別對照表 (IEEE 754 標準,典型 64 位元系統)
| 型別 | 位元數 | 有效位數 (十進位) | 範圍約略 | 記憶體 |
float | 32 | ~6-7 位 | ±3.4e-38 ~ ±3.4e+38 | 4 bytes |
| double | 64 | ~15-16 位 | ±1.7e-308 ~ ±1.7e+308 | 8 bytes |
long double | 80/128 | ~18-33 位 | 更大 | 10/16 bytes |
宣告與初始化範例
double price = 19.99;
double pi = 3.14159265358979323846;
double scientific = 6.022e23; // 科學記號
double negative = -273.15;
double fromInt = 42; // 隱含轉換 int → double
格式化輸入輸出
| 操作 | 格式字串 | 範例 |
scanf 讀取 | %lf | scanf("%lf", &d); |
printf 輸出 | %f (預設 6 位小數) | printf("%.2f", d); → 兩位小數 |
| 科學記號輸出 | %e / %E | printf("%e", d); → 1.999000e+01 |
| 自動選擇 | %g / %G | 短者優先,移除尾隨零 |
常見陷阱與最佳實務
| 陷阱 | 說明 | 對策 |
| 浮點數直接比較相等 | if (a == b) 因精度誤差常失效 | 用 fabs(a-b) < EPSILON (如 1e-9) |
| 累加誤差 | 大量浮點數加總產生誤差 | Kahan Summation 演算法、用 long double 累加 |
| 整數除法截斷 | double d = 5/2; → 2.0 (整數除法先算) | 5.0/2 或 (double)5/2 |
scanf("%f", &d) 讀 double | %f 對應 float,讀 double 需 %lf | 編譯器警告 -Wformat 會提示 |
標準庫數學函數 (<math.h>)
double sqrt(double x); // 平方根
double pow(double x, double y); // x^y
double sin(double x); // 弧度制
double cos(double x);
double log(double x); // 自然對數
double exp(double x); // e^x
double fabs(double x); // 絕對值
double floor(double x); // 向下取整
double ceil(double x); // 向上取整
編譯時需連結數學庫:gcc -lm main.c (GCC/Clang),MSVC 自動連結。
何時選用 double vs float
- 預設用 double:現代 CPU 浮點運算單元原生 64 位元,double 不慢反而更準
- 用 float:大量陣列 (記憶體/頻寬敏感)、GPU 計算、嵌入式無 FPU、網路傳輸封包
- 用 long double:極高精度科學計算、金融利息精算