前言:說完整數(shù)運算拥坛,我們來繼續(xù)說說浮點數(shù)運算
浮點數(shù)的表示
IEEE 754 標準
32 位機器下,單精度浮點數(shù)的表示方法如下:
在機器中這樣表示:
- S 是符號位
-
Exponent 是階碼
規(guī)格化階碼范圍為 0000 0001 (-126) ~ 1111 1110 (127)本慕。
-
Significand 是部分尾數(shù)
也就是上圖中藍色的 xxxx 部分。IEEE 754 標準隱藏了最開始的那個 1侧漓。也就是說锅尘,雖然只有 23 位。但實際上有 24 位
一些特殊的浮點數(shù)
- +/-0
- 正負無窮
- 非數(shù)
- 非規(guī)格化數(shù)字
用規(guī)格化表示的浮點數(shù)有范圍布蔗,正數(shù)最小的值是
- 符號 S:0
- 階碼 E:0000 0001
- 尾數(shù) S:全為 0
得到最小正數(shù):
那么 0~ 就是非規(guī)格化的數(shù)字藤违。
這一段這樣表示(非規(guī)格化):
- 尾數(shù):不全 0
- 階碼:全 0
浮點數(shù)的運算
三種運算
這三種運算結(jié)果可能產(chǎn)生以下幾種情況:
階碼上溢:一個正指數(shù)超過了最大允許值 => 正負無窮或者溢出
階碼下溢:一個負指數(shù)超過了最小允許值 => +0/-0
尾數(shù)溢出:最高有效位有進位 => 需要右規(guī)
非規(guī)格化尾數(shù):數(shù)值部分高位為 0 => 需要左規(guī)
右規(guī)或?qū)﹄A時:右端有效位丟失 => 尾數(shù)舍入
IEEE 754 標準規(guī)定的五種異常情況:
- 無效運算(無意義)
- 運算時有一個數(shù)字是非有限數(shù)
- 結(jié)果無效
- 除以 0(即:無窮大)
- 數(shù)太大(階上溢):對于單精度浮點數(shù),指階碼 E > 1111 1110
- 數(shù)太凶葑帷(階下溢):對于單精度浮點數(shù)顿乒,指階碼 E < 0000 0001
- 結(jié)果不精確(舍入時引起)
上述情況硬件可以捕捉到,因此這些異吃蠼鳎可設(shè)定讓硬件處理璧榄,頁可設(shè)定讓軟件處理特漩。讓硬件處理時,稱為硬件陷阱
浮點數(shù)加減基本要點
有兩點需要注意犹菱!
- IEEE 754 規(guī)定中間結(jié)果必須在右邊加 2 個附加位
- IEEE 754 的就近舍入規(guī)則
浮點運算單元(FPU)
浮點數(shù)運算和整數(shù)運算不同拾稳,所以運算單元當然不同吮炕。早期的浮點處理器是作為 CPU 的「外置協(xié)處理器」出現(xiàn)的腊脱。x87 FPU 特指與 x86 處理器配套的「浮點協(xié)處理器架構(gòu)」
有以下要點:
-
浮點寄存器采用「棧結(jié)構(gòu)」
深度為 8,寬度為 80 位龙亲。即 8 個 80 位的寄存器
名稱為 ST(0) ~ ST(7)陕凹,棧頂為 ST(0),編號分別為 0 ~ 7
- 所有浮點運算都按 80 位拓展精度進行
- 浮點數(shù)在浮點寄存器和內(nèi)存之間傳送
- float鳄炉、double杜耙、long double 型的變量在內(nèi)存中分別用 IEEE 754 單精度、雙精度拂盯、擴展精度表示佑女,分別占 32 位,64 位谈竿,96 位(前 16 位無效)
- float团驱、double、long double 類型變量在浮點寄存器中都用 80 位拓展精度表示
- 從浮點寄存器到內(nèi)存:80 位拓展精度格式轉(zhuǎn)換為 32 位或者 64 位
- 從內(nèi)存到浮點寄存器:32 位或者 64 位轉(zhuǎn)換為 80 位擴展精度格式