C語言高階剖析 3 浮點數的秘密

2021-09-28 19:15:46 字數 1586 閱讀 7616

浮點數在記憶體中的儲存方式為:符號位,指數,尾數

型別符號位

指數尾數

float

1位(第31位)

8位(第23-30位)

23位(第0-22位)

double

1位(第63位)

11位(第52-62位)

52位(第0-51位)

float 與 double 型別的資料在計算機內部的表示法是相同的,但由於所佔儲存空間的不同,其分別能夠表示的數值範圍和精度不同。

如何將浮點數轉換為二進位制數呢,轉換步驟如下:

1、將浮點數轉換成二進位制

2、用科學記數法表示二進位制浮點數

3、計算指數偏移後的值

!!!注意:計算指數時需要加上偏移量,而偏移量的值與型別有關。

例項:對於指數為 6,偏移後的值如下:

float:127 + 6 → 133

double:1023 + 6 → 1029

看了這個過程,仍然不知道怎麼操作,沒關係,下面通過乙個具體的例子操作一遍就會明白。

實數 8.25 在記憶體中的 float 表示

第一步,轉換為二進位制數:8.25的二進位制表示:1000.01

第二步,用科學記數法表示:1000.01 → 1.00001 *(2^3)

第三步,計算指數偏移後的值:

所以,得出記憶體中的 float 表示為:0 10000010 00001 000000000000000000 → 0x41040000

怎麼去驗證實數 8.25 在記憶體中存的就是 0x41040000 呢,其實也很簡單。float 占用四個位元組,unsigned int 也是占用 4 個位元組,我們完全可以用乙個 unsigned int 型別的指標指向這個 float 型別的變數,列印 unsigned int 型別的數值就可以了。

int 和 float 都有乙個數值的表示範圍,如下所示

那麼問題來啦,int 和 float 都是佔 4 位元組的記憶體,為什麼 float 比 int 表示的範圍大呢?

int 和 float 都是佔 4 位元組的記憶體,也就是說他們兩個可以表示的具體數字的個數是相同的,但是 float 有如下特點:

注意:double 和 float 具有相同的記憶體表示法,因此 double 也是不精確的。但是 double 占用的記憶體較多,所能表示的精度比 float 高。

下面通過乙個例子來說明 float 型別的不精確。

可以看到結果是不精確的

1、浮點數型別與整數型別記憶體表示法不同,浮點型別更複雜

2、浮點型別可表示的範圍更大

3、浮點型別是一種不精確的型別

4、浮點型別運算速度慢

C語言高階 浮點數的秘密03

浮點數在記憶體中的儲存方式為 符號位 指數字 尾數 型別f符號位 指數尾數 float 1位 第31位 8位 第23位 30位 23位 第0 22位 double 1位 第63位 11位 第52位 62位 52位 第0 51位 浮點數的轉換 對於指數6 實數8.25在記憶體中的float表實 8.2...

c語言整數轉浮點數 浮點數的秘密

我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...

3 浮點數的秘密

浮點數在記憶體的儲存方式為 s m 2 n主要由三部分構成 符號位 指數 n 尾數 m 型別符號位 指數尾數 float 1位 第31位 8位 第23 30位 23位 第0 22位 double 1位 第63位 11位 第52 62位 52位 第0 51位 float和double型別的資料在計算機...