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

C語言進階:浮點數內存表示與精度損失根因分析

     編輯:關於C語言

回顧與引入:從整數到浮點數

前文已詳解整數(補碼)在內存中的存儲。本講轉向浮點數,以 IEEE 754 標準為核心,推導 float/double 內存佈局,揭示精度損失的兩大根本原因。

整數補碼復習:兩道實戰練習

正數 51,245,412(0x030DF164)

二進制:0000 0011 0000 1101 1111 0001 0110 0100
小端存儲(地址 0x0012FF7C 起):64 F1 0D 03

負數 -6,231,541(補碼 0xFFA0EA0B)

絕對值二進制 → 按位取反 → +1 → FF A0 EA 0B
小端存儲:0B EA A0 FF

調試器 Memory 窗口驗證完全吻合。

正數內存驗證 負數內存驗證

浮點數二進制表示法:科學計數法的二進制版

例:19.375 = 10011.0112 = 1.0011011 × 24。
關鍵步驟:整數部分除二取餘,小數部分乘二取整(或分解為 2 的負冪次和)。

IEEE 754 單精度(float)32位佈局

位段長度說明
符號位1 bit0=正,1=負
指數位8 bits移碼表示,基數 127(即 27-1)。實際指數 E = 存儲值 - 127
尾數位23 bits隱含最高位 1,存儲小數點後 23 位,不足右補 0

19.375 編碼演示

  • 符號位:0
  • 指數:127 + 4 = 131 = 100000112
  • 尾數:0011011 + 16 個 0 → 00110110000000000000000
  • 合併:0 10000011 00110110000000000000000 = 0x419B0000
  • 小端存儲:00 00 9B 41

調試器驗證完美匹配。負數僅需將符號位置 1 → 0xC19B0000。

float正數驗證 float負數驗證

雙精度(double)64位佈局差異

  • 符號位:1 bit
  • 指數位:11 bits,基數 1023(210-1)
  • 尾數位:52 bits

精度損失的兩大根因

  1. 尾數位截斷:二進制科學計數法尾數超過 23/52 位時,低位被捨棄。double 緩解但無法根治(超過 52 位同樣失效)。
  2. 無限循環二進制:許多十進制小數(如 0.2)轉二進制為無限循環(0.001100110011…),無法精確表示,必然產生誤差。

結語

透過手工推導編碼過程,可深刻理解浮點數「近似表示」的本質。下一講將系統講解數據類型,這是構建健壯程序的基石。

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