您當前的位置:首頁 > 體育

計算機組成原理,浮點數的表示以及對其範圍的理解

作者:由 白切雞蘸醋 發表于 體育時間:2021-08-19

昨天為了理解規格化浮點數的範圍這個東西查了各種各樣的部落格花了很長時間,在這裡記錄一下。

首先數在機器裡有四種表示方式:

原碼,反碼,補碼和移碼(增碼)

舉一個例子:

對於一個

八位正數

,最高位為符號位,比如

01001001

那麼它的各種表示如下:

原碼: 01001001

反碼: 01001001

補碼: 01001001

移碼: 11001001

(加上

2^{n-1}

​, 也就是數值位與補碼相同,符號位取反)

對於一個八位負數,最高位為符號位,比如

11001001

那麼它的各種表示如下:

原碼: 11001001

反碼: 10110110

補碼: 10110111

(反碼+1​)

移碼: 00110111

定點資料表示

計算機組成原理,浮點數的表示以及對其範圍的理解

仍以八位資料為例,最高位代表符號位

對於定點整數而言

原碼

表示數的範圍如下所示:

計算機組成原理,浮點數的表示以及對其範圍的理解

其中,最大正數是

2^n-1

​(​

2^n

10000000

,減​1後為

01111111

最小正數是​1

最大負數是​-1

最小負數是

-(2^n-1)

在這個

數軸

上,​0的表示有兩種+0​和-0​

補碼

表示數的範圍如下所示:

計算機組成原理,浮點數的表示以及對其範圍的理解

其中,正數表示範圍不變,最大正數是

2^n-1

最小正數是​1

最大負數也沒變,是​-1

最小負數是

-2^n

(這一點非常重要!

​0只有一種表示方式,並且把​-0向左移動用來表示負數的最小值

所以以補碼為例,定點整數可表示的範圍是​

-2^n

~​

2^n-1

對於定點小數而言

先是原碼,表示資料如下:

計算機組成原理,浮點數的表示以及對其範圍的理解

其中,最大正數為

1-2^{-n}

0。1111111 + 0。0000001 = 1。0000000

最小正數為​

2^{-n}

​0的表示仍然有兩種

最小負數為

-(1-2^{-n})

最大負數為​

-2^{-n}

補碼錶示資料如下:

計算機組成原理,浮點數的表示以及對其範圍的理解

正數不變,最大正數為​

1-2^{-n}

0。1111111+0。0000001 = 1。0000000

最小正數為​

2^{-n}

​0的表示一種,-0​向左移動用來表示負數的最小值

最小負數為​-1

最大負數為​

-2^{-n}

所以以補碼為例,定點小數的可表示範圍是-1​~​

(1-2^{-n})

浮點資料表示

對於定點整數而言由於

小數點

固定,那麼在字長一定的情況下就限制了可以表示數的範圍和精度,所以就引出了浮點資料表示

浮點數表示法是指以適當的形式將比例因子表示在資料中,讓小數點的位置根據需要而浮動。這樣,在位數有限的情況下,既擴大了數的表示範圍,又保持了數的有效精度。

一般格式表示(非規格化)

計算機組成原理,浮點數的表示以及對其範圍的理解

階碼數值位數為m, 尾數數值部分位數為n

數的真值​

N=r^E*M

r

:階碼的底,通常為​

E

:階碼數值,決定數的範圍

W

尾數

,決定數的符號和精度

在這裡可以用科學計數法來理解,比如​

123456=1.23456*10^5

r:10,E:5,W:1.23456

舉個例子:

計算機組成原理,浮點數的表示以及對其範圍的理解

非規格化的範圍:

計算機組成原理,浮點數的表示以及對其範圍的理解

數的真值​

N=r^E*M

r

:階碼的底,通常為​

E

:階碼數值,決定數的範圍

W

:尾數,決定數的符號和精度

原碼錶示:以八位資料為例,4​位表示階碼,4​位表示尾數

對於正數而言

:E最大值為

2^m-1

(​

m

位二進位制數最大值是每一位都是1​,表示的數是

2^m-1

​、而不是

2^m

​),

0111

E最小值為

-(2^m-1)

​,

1111

W最大值為

(1-2^{-n})

​,

0。111

W最小值為​

2^{-n}

0。001

所以N最大值為:

r^{2^m-1}  *(1-2^{-n})

01110111

N的最小值為

r^{-(2^m-1)}  * 2^{-n}

​,

11110001

對於負數而言

:E最大值為

2^m-1

​,

0111

E最小值為

-(2^m-1)

​,

1111

W最大值為

 -2^{-n}

​,

1。001

W最小值為

-(1-2^{-n})

​,

1。111

所以N最大值為:

-r^{-(2^m-1)}  * 2^{-n}

11111001

N​的最小值為

-r^{2^m-1}  *(1-2^{-n})

​,

01111111

補碼錶示:以八位資料為例,​位表示階碼,​位表示尾數

對於正數而言

:E最大值為

2^m-1

​(m​位二進位制數最大值是每一位都是1​,表示的數是

2^m-1

​、而不是

2^m

​),

0111

E最小值為

-2^m

​,

1000

W最大值為​

(1-2^{-n})

0。111

W最小值為

2^{-n}

​,

0。001

所以N最大值為:

r^{2^m-1}  *(1-2^{-n})

​,

01110111

N的最小值為

r^{-2^m}  * 2^{-n}

​,

11110001

對於負數而言

:E最大值為

2^m-1

​,

0111

E最小值為

-2^m

​,

1000

W最大值為

 -2^{-n}

​,

1。111

W最小值為

-1

​,

1。000

所以N最大值為:

-r^{-(2^m-1)}  * 2^{-n}

​,

11111001

​N的最小值為

-r^{2^m-1}  *(1-2^{-n})

​,

01111111

一般格式表示(規格化)

首先來看看什麼是規格化。

規格化指的是:尾數的數值位最高位必須是一個有效值

什麼意思捏?

也就是在原碼下尾數必須是

0。1XXX。。。XXX

這種形式,並且當尾數不是這種形式時必須對其進行移位處理且伴隨著階碼的改變。

比如:

左規:尾數算術左移1,階碼減1

b = 2^1 * (+0.01001)  =>  b=2^0 * (+0.10010)

右規:浮點數的結果出現溢位,將尾數右移1,階碼加1

a =2^2 * 00.1100, b = 2^2 * 00.1000

a + b = 2^2 * (00.1100 + 00.1000)

=2^2 * 01.0100

=2^3 * 00.1010 = 2^3 * 0.1010

可以用

十進位制

的科學計數法來理解這個東東。

辣麼問題來咯:

對於規格化的浮點數,以原碼形式儲存,它表示的範圍是什麼捏???

計算機組成原理,浮點數的表示以及對其範圍的理解

數的真值​

N=r^E*M

r

:階碼的底,通常為​

E

:階碼數值,決定數的範圍

W

:尾數,決定數的符號和精度

原碼錶示:以八位資料為例,4​位表示階碼,4​位表示尾數

對於正數而言

:E最大值為

2^m-1

(m​位二進位制數最大值是每一位都是​1,表示的數是

2^m-1

​而不是

2^m

​),

0111

E最小值為

-(2^m-1)

​,

1111

W最大值為

(1-2^{-n})

​,

0。111

W最小值為

\frac{1}{2}

​,

0。100

所以N最大值為:

r^{2^m-1}  *(1-2^{-n})

01110111

N的最小值為

r^{-(2^m-1)}  * \frac{1}{2}

​,

11110100

對於負數而言

:E最大值為

2^m-1

​,

0111

E最小值為

-(2^m-1)

​,

1111

W最大值為

 -\frac{1}{2}

​,

1。100

W最小值為​

-(1-2^{-n})

1。111

所以N最大值為:

-r^{-(2^m-1)}  * \frac{1}{2}

​,

11111000

N的最小值為

-r^{2^m-1}  *(1-2^{-n})

​,

01111111

再進一步,以補碼形式儲存呢?其範圍又是多少呢?(這個問題想了好久)

以補碼形式儲存的尾數

對於正數,規定必須是

0。1XXXXX。。X

這種形式

對於負數,規定必須是

1。0XXXXX。。X

這種形式

記住上面兩種規定,理解的偏差就在此處

計算機組成原理,浮點數的表示以及對其範圍的理解

數的真值​

N=r^E*M

r

:階碼的底,通常為​

E

:階碼數值,決定數的範圍

W

:尾數,決定數的符號和精度

補碼錶示:以八位資料為例,4​位表示階碼,4​位表示尾數

對於正數而言

:E最大值為

2^m-1

​(m​位二進位制數最大值是每一位都是​1,表示的數是​

2^m-1

,而不是

2^m

​),

0111

E最小值為

-2^m

​,

1000

, 注意此處補碼錶示的範圍擴大了

W最大值為

(1-2^{-n})

​,

0。111

W最小值為

\frac{1}{2}

​,

0。100

所以N最大值為:

r^{2^m-1}  *(1-2^{-n})

01110111

N的最小值為

r^{-2^m}  * \frac{1}{2}

​,

10000100

對於負數而言

:E最大值為

2^m-1

​,

0111

E最小值為

-2^m

​,

1000

注意此處補碼錶示的範圍擴大了

W最大值為

-(\frac{1}{2}+2^{-n})

​,

1。011

其原碼為

1。101

W最小值為

-1

1。000

,此處由於是補碼,所以範圍擴大

!!!!!重點來了,為什麼W的最大值是這樣呢???,為什麼不是

-\frac{1}{2}

​捏??

注意我上面對負數補碼尾數的規定:對於負數,規定必須是1.0XXXXX..X這種形式,如果原碼是1.100,它取補後的結果還是1.100也就不滿足1.0XXXXX..X這種形式了

,所以

要想取補後是

1。0XXXXX。。X

那麼原碼必須是

1。1XXXXX。。X

這樣

由於·

1。100000。。0

取補後仍為其本身,所以它不能當作最大的負尾數

所以最大的負尾數為

1。10000。。。1

,取補後為

1。0111111。。。1

所以N最大值為:

-r^{-2^m}  * (\frac{1}{2} + 2^{-n})

​,

10001011

的最小值為

-r^{2^m-1}

​,

01111000

(有錯誤歡迎在評論區指出!)

參考:

計算機組成浮點數補碼規格化負數表示範圍

負數補碼錶示範圍以及規格化數

浮點數所表示的數值範圍

定點數與浮點數(小數)

浮點數的表示 —— 基本格式、規格化、表示範圍

華中科技大學

計算機組成原理MOOC

計算機組成原理,浮點數的表示以及對其範圍的理解

標簽: 最大值  最小值  補碼  負數  尾數