計算機中浮點數的表示

2021-06-22 23:05:04 字數 1800 閱讀 7171

浮點數就是有小數點的數。

在c語言中有三種浮點數,分別為float,double和long double。下面分析一下其實現。

#include int main(int argc, char *argv)

這是乙個簡單的c語言程式,定義了三個不同型別的變數a、b、c。編譯後用gdb除錯下

(gdb) p sizeof(a)

$1 = 4

(gdb) p sizeof(b)

$2 = 8

(gdb) p sizeof(c)

$3 = 16

可以看到float佔4位元組,double佔8位元組,long double佔16位元組。

在計算機中儲存浮點數一般使用科學技術法,如12345=>0.12345e5,只不過在計算機中使用的是二進位制數,像十進位制數10,先翻譯成二進位制數110,再換成指數形式0.11*(2)3。這裡以float為例來說明一下浮點數的儲存方式。

(gdb) set var a = 0

(gdb) x/t &a

0x7fff5fbffbbc: 00000000000000000000000000000000

把a的值設為0,以二進位制方式現實,結果是32個零。計算機把這32位數分成3部分,[0]為符號位,[1~8]為指數部分,[9~31] 為底數部分。

再看看十進位制數2的表示

(gdb) set var a = 2

(gdb) x/t &a

0x7fff5fbffbbc: 01000000000000000000000000000000

符號位為0,表示正,1為負,指數部分為10000000,底數部分為23個零。

使用科學技術法時最高位都是1,如101,1100等,在高位放0是沒有意義的,如001010可表示為1010,因此,底數部分最高位的1將捨去,因為最高位必定有乙個1,所以這裡的23個0實際為100000000000000000000000,表達的底數為0.100000000000000000000000,即1。

指數部分為10000000。底數為1這裡要表示的數為10,即十進位制數為2,則指數為1,可是10000000如果能表示2呢,再做個實驗。

(gdb) set var a = 1

(gdb) x/t &a

0x7fff5fbffbbc: 00111111100000000000000000000000

這裡底數部分還是23個0,表示的底數為1,要表示1的話指數部分為0。

指數部分考慮到純小數指數為負的原因,把指數看成無符號數加上127才是其儲存的指數值。

如10000000要表達的指數為1。

來實驗一下,十進位制數22.2,翻譯成二進位制數為10110.001100110011001100110011001100110011....................

則底數為01100011001100110011001,之後的數字將會被捨去,這就是為什麼浮點數不能儲存精確值的原因

指數為4,加127那就是,131,翻譯成二進位制數那就是10000011

符號位為0,那麼十進位制數22.2在計算機中則儲存為01000001101100011001100110011001

看驗證,和之前計算完全符合。

(gdb) set var a = 22.2

(gdb) x/t &a

0x7fff5fbffbbc: 01000001101100011001100110011001

計算機中浮點數的表示

在c語言中浮點數有兩個size,32位和64位。其中32位浮點數 第1位是signflag 符號位 2 9位是階碼位 exponent 10 32位是尾數字 significand 64位分別是第1位,2 12位,13 64位。浮點數大小的公式是 x 1 2 e m e exp 2 1 將 exp ...

浮點數在計算機中的表示

浮點數在計算機中的表示 最後編輯於 2010 4 13 計算機中數字是以0和1二進位制儲存的,我們熟悉的是整數的如何在計算機中表示,那麼浮點數是如何表示的呢?一 轉換 我們先來看看如何將十進位制的浮點數轉換成二進位制。乙個十進位制的浮點數,例如 abcd.efg 其中a g為0.9 其值用多項式為 ...

計算機中的浮點數

寫這篇blog,是因為在上工程碩士數學時候,又開始講到了浮點數的儲存,運算和精度的問題。這個問題已經見了好多次了,從微機原理的課到計算機視覺處理矩陣時候的conditioning,到這次。但感覺一直都沒有理清楚。所以這次嘗試梳理一下。一般主要分為兩種形式,這裡以8位的儲存進行解釋 所以用浮點數表示數...