verilog中的定點數、浮點數、定點小數、定點整數的表示及運算

1、定點數:

                    顧名思義定點數就是小數位固定不變的數叫做定點數,也就是小數點是定在某個位置不變的數。

 2、定點數的分類:

                  (1)定點整數:定點整數的小數點後面沒有其他的數值,即小數點定在了數的最後面

                          定點整數又分爲以下兩類:

                          @@:無符號的定點整數:Unsigned fixed point integer,無符號定點整數沒有符號位,所以它的全部數位都用來表示數字,且它的小數點隱含在最低位後,在它的二進制形式中不存在小數點(數在計算機中都是以二進制的形式進行存儲的)。

                          對於某種數的表示方式,我們關心兩點:

                          1.表示範圍:這種方法表示數的大小(正負方向),無符號定點整數範圍:0~2n-1

                          2.分辨率:精度,1(即最小非零正數)

                         二進制數:XnXn-1...X1X0表示無符號定點整數,則有n+1位正整數,它所代表的十進制數大小爲:

                        

                       例如8位無符號二進制數的表示範圍爲:00000000-11111111:0-255

                       @@:帶符號定點整數

                       定義:帶符號定點整數是純整數,小數點在最低位之後,最高位爲符號位,它與無符號定點整數的區別就是它的                                       最高位只用來指示符號,不代表實際數值,並且它在計算機中以而二進制的補碼形式存儲。

                                   

                          XnXn-1...X1X0表示無符號定點整數(假設是原碼形式),則有n+1位正整數,它所代表的十進制數大小爲:

                        

                         最高位爲0代表正數,最高位爲1代表負數。

                       例如8位有符號二進制數的表示範圍爲:00000000-11111111:-128 到127

(2)有符號定點小數:

                    

            定點小數即純小數(但好多博客都說小數的位數和正數的位數可以事先約定,那這樣的話就不是純小數了,這一點還有疑惑,小數點的位置固定在最高有效數位之前、符號位之後,如圖1所示。定點小數的小數點位置是隱含約定的,小數點並不需要真正地佔據一個bit。

                  
                                                                      圖1 定點小數格式
    當 Xs = 0 時,該小數爲正值,其原碼和補碼錶示的形式相同。

    其中,

    ⑴ 絕對值最大的正小數爲:

                                                                  

     其實際值等於(通過移項及合併同類項,可知該等式成立): 

                             

    ⑵ 絕對值最小的正小數爲: 

                                           

    其實際值等於: 

                                           

    以8bit數爲例,最大正小數爲 0.111 1111 = 1 - 2⁻⁷;最小正小數爲 0.000 0001 = 2⁻⁷

    當 Xs = 1 時,該小數爲負值,有原碼和補碼兩種表示形式(以下形式包含Xs位)。 

    ⑴ 絕對值最大的負小數

        ① 原碼錶示

                    

         ② 補碼錶示

                     

    ⑵ 絕對值最小的負小數

        ① 原碼錶示

                    

         ② 補碼錶示

                         

    可見,定點負小數的原碼錶示範圍爲: -(1 - 2⁻ⁿ) ~ -2⁻ⁿ;其補碼錶示範圍爲:-1 ~ -2⁻ⁿ。且n值越大,精度越高。


3.verilog中的定點小數

         程序指定小數點的位置即爲定標,有兩種方法:Q表示方法和S表示方法。
(1) Q表示法:Qn表示低n位爲小數,其餘位爲符號位和整數位。
(2) S表示法:Sn中低(15-n)爲小數,其餘位符號位和整數位。
在使用XILINX VIVADO 中的IP核,都是以Q表示法表示。

                    定點小數的表示範圍:

              其中N爲定點數的位數(排除符號位),n爲定標的位數,其中n越大則數據越精確,但表示的範圍也會越小

其中N爲定點數的位數(排除符號位),n爲定標的位數,其中n越大則數據越精確,但表示的範圍也會越小。

           假設有一個16位的變量,設定小數佔8位,那麼它的精度爲8位,那麼它的精度是多少呢? 其實就是1/2^8=0.00390625.

          (0.5,0.25,0.125,0.0625,0.03125,0.015625,0.0078125,0.00390625)

         例如:reg [15:0] a=16'b0111_1011_1111_0000             它表示的定點小數爲:31728/(2^8) = 123.9375也就是:

                 01111011.11110000的十進制數值

 

        假設一個數2.3,它的二進制形式爲10.0100110........後面有無窮多位;但約定好小數的位數爲5位之後,則這個數就成爲了2.28125,小數的位數越多。精度越高,越接近其真值;

          

     那麼我們假設x,x1,x2爲實際小數,y1,y2,y3爲定點小數,定位精度是n位,有如下關係

y1=y2+y3 <<=>>x1=x2+x3

y1=y2-y3 <<=>>x1=x2-x3

y1=y2/2^n*y3 <<=>>x1=x2*x3

y1=y2*2^n/y3 <<=>>x1=x2/x3

加減比較好理解,乘除爲什麼需要移位呢?以乘法爲例子

y1=x1*2^n

y2*y3=x2*x3*x^2n                  ==>>y1*2^n=y2*y3 證畢
 

4.浮點數

      浮點數是一種 公式化 的表達方式,用來近似表示實數(浮點數也是實數),並且可以在表達範圍和表示精度之間進行權衡(因此被稱爲浮點數)。

浮點數通常被表示爲:

N=M×R^E

比如: 12.345=1.2345×10^1

其中,M(Mantissa)被稱爲浮點數的 尾數 ,R(Radix)被稱爲階碼的 基數 ,E(Exponent)被稱爲階的 階碼 。計算機中一般規定R爲2、8或16,是一個確定的常數,不需要在浮點數中明確表示出來。

因此,在已知標準下,要表示浮點數,

一是要給出尾數M的值,通常用定點小數形式表示(這裏表示:純小數),它決定了浮點數的表示精度,即可以給出的有效數字的位數。

二是要給出階碼,通常用定點整數形式表示,它指出的是小數點在數據中的位置,決定了浮點數的表示範圍。因此,在計算機中,浮點數通常被表示成如下格式:(假定爲32位浮點數,基爲2,其中最高位爲符號位)

32位浮點數:

                      

            浮點數

64位浮點數:

              

       

浮點數的規格化表示 

按照上面的指數表示方法,一個浮點數會有不同的表示:

0.3×10^0;0.03×10^1;0.003×10^2;0.0003×10^3;

爲了提高數據的表示精度同時保證數據表示的唯一性,需要對浮點數做規格化處理。

在計算機內,對非0值的浮點數,要求尾數的絕對值必須大於基數的倒數,即|M|≥1/R。

即要求尾數域的最高有效位應爲1,稱滿足這種表示要求的浮點數爲規格化表示:把不滿足這一表示要求的尾數,變成滿足這一要求的尾數的操作過程,叫作浮點數的規格化處理,通過尾數移位和修改階碼實現。

比如,二進制原碼的規格化數的表現形式:(0正1負)

正數 0.1xxxxxx

負數 1.1xxxxxx

爲了提高數據的表示精度,當尾數的值不爲0時,尾數域的最高有效位應爲1,這稱爲浮點數的規格化表示。否則以修改階碼同時左右移動小數點位置的辦法,使其變成規格化數的形式。

 

至此,我們引入IEEE754 標準,該標準約束了浮點數的大部分使用設置:(尾數用原碼;階碼用“移碼”;基爲2)

在IEEE754標準中,一個規格化的32位浮點數x的真值表示爲
x = (-1) ^s X(1.M)X 2^(E-127)
e = E - 127
其中尾數域所表示的值是1.M。由於規格化的浮點數的尾數域最左位(最高有效位)總是1,故這一位經常不予存儲,而認爲隱藏在小數點的左邊。於是用23位字段可以存儲24位有效數。(沒有理解爲啥這樣)

64位的浮點數中符號位1位,階碼域11位,尾數域52位,植樹偏移值是1023.因此規格化的64位浮點數x的真值爲
x = (-1)s X(1.M)X 2^(E-1023)
e = E - 1023

總結如下:

(1) 尾數用原碼,且隱藏尾數最高位。

原碼非0值浮點數的尾數數值最高位必定爲 1,因此可以忽略掉該位,這樣用同樣多的位數就能多存一位二進制數,有利於提高數據表示精度,稱這種處理方案使用了隱藏位技術。當然,在取回這樣的浮點數到運算器執行運算時,必須先恢復該隱藏位。

(2) 階碼使用“移碼”,基固定爲2

如下圖的32bit浮點數和64bit浮點數,從最高位依次是符號位、階碼和尾數 

float

於是,

一個規格化的32位浮點數x的真值爲:

x=(−1)^s×(1.M)×2E^−127

一個規格化的64位浮點數x的真值爲:

x=(−1)^s×(1.M)×2E^−1023

下面舉一個32位單精度浮點數-3.75表示的例子幫助理解:

(1) 首先轉化爲2進製表示

−3.75=−(2+1+1/2+1/4)=−1.111×2^1

(2) 整理符號位並進行規格化表示

−1.111×2^1=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1

(3) 進行階碼的移碼處理 
(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1
 
=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^(128−127)

於是,符號位S=1,尾數M爲1110 0000 0000 0000 0000 000
階碼E爲12810=1000 00002
,則最終的32位單精度浮點數爲

1 1110 0000 0000 0000 0000 000 1000 0000

例題
1. 問題: 若浮點數x的754標準存儲格式爲(41360000)16,求其浮點數的十進制數值。
解:將16進制數展開後,可得二進制數格式爲

在這裏插入圖片描述

指數e=階碼-127=10000010-01111111=00000011=(3)10
包括隱藏位1的尾數1.M=1.011 0110 0000 0000 0000 0000=1.011011
於是有
x=(-1)^S X 1.M X 2^e=+(1.011011) X 2^3 = +1011.011=(11.375)10

2. 問題: 將數(20.59375)10轉換成754標準的32位浮點數的二進制存儲格式。
解:首先分別將整數和小數部分轉換成二進制數:
20.59375 = 10100.10011
然後移動小數點,使其在第1、2位之間
10100.10011 = 1.010010011 X 2^4 e = 4
於是得到
S = 0, E = 4 + 127 = 131, M = 010010011
最後得到32位浮點數的二進制存儲格式爲
0100 0001 1010 0100 1100 0000 0000 0000 = (41A4C000)16
 

浮點數表示範圍:

通過上面的規格化表示,我們可以很容易確定浮點數的表示範圍:

 

float range

 

既然有表示範圍,那肯定也有不能表示的數值: 
首先來說明溢出值,如下圖: 

float overflow

 

(1)無窮值:

如果指數E=11111111(2)=255(10)
且尾數M=0
,則根據符號位S分別表示+∞
和−∞
。因此,一個有效的32位浮點數其指數最大隻能爲254。

此外,無窮具有傳遞性,比如

(+∞) + (+7) = (+∞)

(+∞) × (−2) = (−∞)

(+∞) × 0 = NaN

(2)零值:

如果指數E=0
且尾數M=0
時,表示機器0.需要注意的是,這裏的0也是有符號的,在數值比較的時候 +0=−0
; 但在一些特殊操作下,二者並不顯相等,比如log(x), 1/+0≠1/−0。

此外,處於負下溢出和負上溢出之間的數值會被直接歸爲0。

(3)NAN:

如果E=0,且尾數M≠0,則表示這個值不是一個真正的值(Not A Number)。NAN又分成兩類:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN與SNAN的不同之處在於,QNAN的尾數部分最高位定義爲1,SNAN最高位定義爲0;QNAN一般表示未定義的算術運算結果,如0/0, ∞×0, sqrt(−1);SNAN一般被用於標記未初始化的值,以此來捕獲異常。

 

浮點數的表示精度

一般提到浮點數的精度(有效位數)的時候,總是會出現 float的有效位爲6~7位, double的有效位爲15~16位 。

下面以float爲例,解釋一下有效位數是怎樣來的。

有效位數只和規格化浮點數的尾數部分有關,而尾數部分的位數是23位,因此我們首先列出下表

float overflow

由上面的表格可以看出:

2^−23 和 2^−22 之間是存在間隔的,即0.0000001和0.0000002之間的小數我們是沒有辦法描述的,因此23位尾數最多隻能描述到小數點後第7位;此外,我們通過四捨五入可以很容易發現0.0000003=0.0000004=2^−23+2^−22
, 這表明第7位有效數字只是部分準確。而第6位及之前的都是可以準確描述的,因此我們說float的有

 

以上內容只是網上內容的總結與整合,所以也不是原創;

https://blog.csdn.net/qq_43164708/article/details/105178210

https://www.cnblogs.com/Mayfly-nymph/p/11090241.html

https://blog.csdn.net/qq_43164708/article/details/105178210

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章