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

float 與 double 範圍、精度與存儲結構深度解析

     編輯:關於C語言

存儲結構(IEEE 754)

類型符號位指數位尾數位總位數
float182332
double1115264

數值表示:(-1)^S × 1.M × 2^(E - bias),其中 M 為尾數小數部分,隱含整數位 1;bias 為指數偏移(float 127,double 1023)。

數值範圍

  • 指數範圍:
    • float:E ∈ [1, 254](0 和 255 保留),真指數 e ∈ [-126, +127]。
    • double:E ∈ [1, 2046],真指數 e ∈ [-1022, +1023]。
  • 絕對值最大值(正規數):
    • float:(2 - 2^-23) × 2^127 ≈ 3.4028235 × 10^38
    • double:(2 - 2^-52) × 2^1023 ≈ 1.7976931348623157 × 10^308
  • 最小正正規數:
    • float:2^-126 ≈ 1.17549435 × 10^-38
    • double:2^-1022 ≈ 2.2250738585072014 × 10^-308
  • 非正規數(次正規數)可表示更小值(float 至 ~1.4e-45),但精度極低。

精度(有效數字)

  • 二進制有效位:float 24 位(含隱含 1),double 53 位。
  • 十進制有效位數:
    • float:log10(2^24) ≈ 7.22 → 6~7 位(保證 6 位)。
    • double:log10(2^53) ≈ 15.95 → 15~16 位(保證 15 位)。
  • 機器 epsilon (ε):1 與下一個可表示數的差。
    • float:2^-23 ≈ 1.19e-7
    • double:2^-52 ≈ 2.22e-16

EPSILON 由來與比較

浮點數與 0 比較大小,或判斷相等,需引入容差:

const float EPS = 1e-6f;  // 對應 float 精度
const double EPS = 1e-12; // 對應 double 精度
if (fabs(a - b) <= EPS) // 視為相等

ε 直接源於尾數位數:最小可區分的相對差異約為 2^(-尾數位)。

常見誤區

  1. float 範圍到 10^38 就以為精度也高 → 範圍由指數決定,精度由尾數決定,兩者獨立。
  2. 用 float 存錢/精確測量 → 0.1 無法精確表示,累加誤差巨大,必用定點或 decimal。
  3. 直接 == 比較 → 絕大多數計算結果有微小誤差,必用相對/絕對誤差判斷。
  4. 以為 double 只是「更大的 float」 → 精度提升 10^9 倍,質的飛躍,科學計算首選 double。

總結

float:32 位,範圍 ~10^±38,精度 6~7 位。
double:64 位,範圍 ~10^±308,精度 15~16 位。
指數決定「能表示多大/多小」,尾數決定「能分多細」。現代 CPU double 運算無性能劣勢,除非嵌入式/顯存/帶寬極其受限,默認使用 double。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved