首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實數型態完全指南:浮點常數形式、單雙精度差異與精度陷阱

     編輯:關於C語言

實數常數兩種表示形式

1. 十進位小數形式

由數字 0-9 與小數點組成,可帶正負號。


合法:0.0, .25, 5.789, 0.13, 5.0, 300., -267.8230
非法:345(無小數點,屬整數常數)

關鍵:必須包含小數點,否則視為整數常數。

2. 科學標記法(指數形式)

格式:a E n 或 a e n(a 為十進位數,n 為十進位整數,可帶正負號)
值:a × 10ⁿ


合法:2.1E5 (2.1×10⁵), 3.7E-2 (3.7×10⁻²), 0.5E7, -2.8E-2
非法:345 (無小數點), E7 (無底數), -5 (無 E), 53.-E3 (負號位置錯), 2.7E (無指數)

標準 C 後綴符

  • f / F:明確指定為 float 型態(單精度)
  • 無後綴:預設為 double 型態(雙精度)

356f 等價於 356.0f (float)
356. 等價於 356.0 (double)

驗證範例


void main() {
    printf("%f\n%f\n", 356., 356f);  // 兩者輸出相同數值,但型態不同
}

實數變數:單精度 vs 雙精度

特性float (單精度)double (雙精度)
關鍵字floatdouble
記憶體大小4 bytes (32 bits)8 bytes (64 bits)
數值範圍3.4E-38 ~ 3.4E+381.7E-308 ~ 1.7E+308
有效數字7 位15-16 位
宣告範例float x, y;double a, b, c;

關鍵規則

  • 實數常數不分單雙精度,預設皆為 double
  • 指派給 float 時發生隱式轉換(double → float),可能損失精度

精度差異實測範例


void main() {
    float a;
    double b;
    a = 33333.33333;
    b = 33333.33333333333333;
    printf("%f\n%f\n", a, b);
}

結果分析:
- a (float):整數部分 5 位,僅剩 2 位小數有效,後續皆為雜訊
- b (double):16 位有效數字完整保留,但 printf("%f") 預設僅顯示小數 6 位,四捨五入

Turbo C 觀察視窗追蹤範例

教材提供兩組 Practice 區塊,模擬除錯器變數觀察視窗(Vtable/Vupdate),展示變數值隨程式執行逐步變化:

範例 1:混合型態運算追蹤


// 程式碼
int a = 32;
float b;
double d;
b = 12345678;
d = b * 100;
d = d + a;
d = d + 58.123456;

// 觀察視窗變化
// 初始:a=32, b=0.0, d=0.0
// b=12345678.0 → 實際儲存約 1.2345678E7(float 精度限制)
// d=1234567800.0
// d=1234567832.0
// d=1234567890.123456

範例 2:型態轉換與截斷追蹤


// 程式碼
int a = 543;
float b;
b = 123.123962 + a;  // a→float,相加
b = b - 100;         // float 減法
a = b;               // float→int 截斷

// 觀察視窗變化
// 初始:a=543, b=0.0
// b=123.123962
// b=23.123962
// a=23(截斷小數)

實務開發避坑指南

  1. 貨幣/金融計算勿用浮點數:二進制無法精確表示 0.1 等十進位小數,累積誤差嚴重。建議用定點數(整數存分/厘)或十進位庫
  2. 比較浮點數勿用 ==:採用誤差範圍 fabs(a-b) < EPSILON
  3. 預設常數為 double:float f = 0.1; 會有 double→float 轉換,建議 float f = 0.1f;
  4. 列印精度控制:printf("%.10f", d) 顯示 10 位小數,%e 科學標記法
  5. 避免大小數相加減:1e10 + 1.0 - 1e10 可能得 0 而非 1(精度吞沒)

總結

  • 實數常數:小數形式(必有小數點)或科學標記法(aEn)
  • 後綴 f/F 指定 float,否則預設 double
  • float:4 bytes、7 位有效數字;double:8 bytes、15-16 位
  • 實數常數皆為 double,指派 float 會隱式轉換
  • 精度有限,金融計算禁用,比較用容差,大小數運算注意順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved