一種小數表示方法

2021-10-12 18:19:03 字數 4783 閱讀 4677

1、浮點數:小數點位置是漂浮不定的。

例如:浮點數運算 1.1 * 1.1 = 1.21,小數點位置發生了變化。

ieee 754 規定,浮點數的表示方法為:

最高的 1 位是符號位 s,接著的 8 位是指數e,剩下的 23 位為有效數字 m。

**2、定點數:**小數點的位置是確定的。

例如:定點數運算 1.1 * 1.1 = 1.2,小數點的位置沒有變化。

定點的意思是,小數點固定在 32 位中的某個位置,前面的是整數,後面的是小數。

小數點具體固定在**,可以自己在程式中指定。

以下針對浮點數的定點化進行討論:

小數例子 : 2.918 12.918 3.1415926

轉成定點數要定義小數需求多少位,整數需求多少位

例:16位的定點數(max:16』d32767 min:-32768)

3位整數字寬,12位的小數字,最高位的符號位

取低15位,其中第14,13,12位最大能表示7,

小數最大12位能表示的最大精度:1/4096=0.000244140625

(0.000244140625*4095 = 0.999755859375)

極限最大值表示:7.999755859375

說明:判斷能否用12位精度表示(即:無損失定點化),看能否除盡:

比如:12.918

3位整數字寬最大只能表示7 所以整數12需要4位位寬

小數部分0.918 判斷:0.918/0.000244140625 = 3760.128 所以12位小數字能表示0.918

例:2.918進行定點化的過程:

8/32768 = 0.000244140625(最大精度),

這裡是因為16位的定點數,3位整數字寬,12位的小數字,最高位的符號位。所能表示的最大絕對值是-8所對應的,而16bit所能表示的最大絕對值是-32768所對應的,所以16bit的最大精度為8/32768.也可以用7.999755859375/32767

更簡單的,因為小數字寬為12bit,所以精度為1/2^12=0.000244140625(最大精度)

2.918/0.000244140625 = 11952.128 四捨五入的量化形式最終取11952, 表示2.918定點後的值

也可以直接2.918x2^12=11952.128

量化誤差為:11952*0.000244140625=2.91796875,2.918-2.91796875=0.00003125

例:3.1415926進行定點化

3.1415926/(8/32768) ~=12,867.9632896,四捨五入取12868

12868轉化為浮點數: 16』d12868 = 16』b0011 0010 0100 0100

其中: 整數部分表示 011 = 3 小數部分表示 0010 0100 0100 = 580

(10進製數580需要轉換成小數:580/4096=0.1416015625)

量化誤差:

12868-12,867.9632896=0.0367104;0.0367104/2^12=0.0000089625

或者:3.1415926-12868*(1/2^12)=-0.0000089625,量化誤差0.0000089625

無損量化:

所謂【無損定點化】只是數學概念,只要量化誤差小於精度的一半,就認為是「無損」的。按照這個標準,那對小數點採取四捨五入的結果必然是無損的。但是校招時很多題採取的是「量化後直接去除小數」,那麼小數大於 0.5 則不是無損的了。

對12.918進行無損量化,要保留小數點後四位,就是比0.001多一位,同樣,二進位制的2^-8是0.00390625,它是0.008的1/2,也就是說在二進位制中它能精確到0.008的後一位,也就是可以做到無損量化了。

總結:1.定義位寬

2.表示出最大最小值

3.定點化過程

浮點數的乘法表示(注意相乘后位寬變化):

例:2.9183.1415926 ~= 1195212868

浮點結果 : 2.9183.1415926 = 9.1671672068

定點結果 : 1195212868 = 153798336 ~= 9.167095184326171875

‭‬153798336 = 0000 1001 0010 1010 1100 0110 1100 0000‬

整數部分表示: 001001 = 9

小數部分表示: ‭2803392‬/(2^24) = 0.167095184326171875‬

例:正數的定點化

5bit的正數字,8bit的小數字

11.11111定點數的結果

很簡單因為8bit的小數字,所以最大精度為1/2^8=0.00390625

11.11111/0.00390625=2844.44416,所以2844即為11.11111的定點化表示形式,

量化誤差

2844=0_1011_0001_1100,5bit 0_1011表示整數部分11,8bit 0001_1100表示小數部分0.11111

定點數相乘

定點轉換(qn=12)

符號1位,整數取3位(實際2位就夠),小數12位,可以看成把 1 分成了 212份,因此:

2.918 * 212 = 11952.168 = 11952;

3.1415926 * 212 = 12867.8632896 = 12868;

11952 * 12868 = 153798336。

相乘後,整數部分為 6 位,小數部分為 24 位。因此結果 = 153798336 / 224 = 9.167095184326171875,和原計算值差距非常小。

一種浮點數表示方法

(是否有符號數,總位寬,小數部分位寬)

小數部分位寬是指小數部分量化精度

舉例:(0,8,6):8』b0100_0010 :表示無符號數,8-0-6=2,2bit表示整數字,6bit表示小數字:1+2*(1/2^6)=1.03125; 反過來,1.03125* 2的6次方 = 8』b0100_0010;

(1,9,3):9』b1_1110_0101表示有符號數,最高位是符號位,9-1-3=5,次5bit是整數字,剩下3bit是

小數字:-(28+5*(1/2^3))= -28.625

比如說兩個(1,9,3)的數參與運算:

-28.625:9』b1_1110_0101 ; -3.125:9『b1_0001_1001

符號位不參與運算:

9』b1_1110_0101 + 9『b1_0001_1001 = 10』b10_1111_1110

10』b10_1111_1110 是(1,10,3)的數,即:-(31+6/2^3)= -31.75

(1,6,8):此種情況較為特殊,小數部分位寬精度大於整個資料位寬,此時除去最高位符號位剩餘的所有bit都表示小數部分。這是因為某些情況下,小數精度達到小數點後8bit但是,有效位只保留6bit,這樣做是為了節省資源,再資料在參與運算時,可以降低加法器/乘法器等運算位寬或者說暫存器等。

如:10_0111 表示有符號數,-(7*(1/(2^8)))=-0.02734375

此處負數不是補碼???

另外浮點數量化方法有:

低位截位,高位截位,飽和截位(大於某閾值取最大值,小於某閾值取最小值),四捨五入,向下取整,向上取整 等

為什麼需要補碼?

都是因為「0」這個特殊數字的存在。

先問你乙個問題:0是正數還是負數?你肯定會說:0既不是正數也不是負數,這是我們初中學到的數學知識。這個回答沒有問題,所以以後每次碰到0,人們都不會把它當正數或負數。

那麼計算機呢?計算機不同於人腦,計算機在碰到任何數字之前只根據最高位的符號位來判斷正負性,「0」表示正數,「1」表示負數。

前面我們推論了為何要用反碼,那麼用8位二進位制反碼表示的正數範圍: +0 —— +127;負數範圍: -127 —— -0。但是,其中有兩個特殊的編碼會出現:

[0_0000000]=+0 (反碼)

[1_1111111]=-0 (反碼)

其實,+0和-0代表的都是0。這樣一來,「0」這個數字在計算機中的編碼就不是唯一的了。對於計算機來說,這是絕對不行的,因為任何數字都只能有1個編碼。

於是,聰明的人就做了這樣乙個決定:把0當成正數,也即+0,這樣0的編碼就變成:0_0000000。那8位二進位制表示的正數範圍仍然是: +0 —— +127。

但是,對於負數就必須要做調整,也即-0必須要讓位—1_1111111這個編碼不能表示-0。我們可以把負數整體向後「挪動1位」:只要將8位二進位制表示的負數範圍從:-127 —— -0變成:-128 —— -1,就能成功解決問題。

那麼怎麼整體挪動1位呢?方法就是反碼+1。編碼就不再表示-0,而變成了-1。順著推,最小的編碼就是-128。

我們給這個反碼+1又人為的取了乙個新的名字,叫補碼。於是乎,補碼的定義如下:

1.正數的補碼保持原碼不變:3=

2.負數先求反碼,然後再加1:-5=[1_1111010]+1=

於是3+=的計算過程為:

+=至此,通過補碼就成功解決了數字0在計算機中非唯一編碼的問題,且也能實現減法變加法。

所以,在計算機的世界裡,0是正數。這點和我們學的數學不一樣。

=+127 (補碼)

=+0 (補碼)

=-1 (補碼)

=-128 (補碼)

用整數表示小數

在嵌入式開發過程中,為了在顯示端顯示小數 負數等非uint型別數值,往往採用將資料放大10倍 100倍等,今天看到另一種方法,特此記錄 這個方法的核心公式是y kx m y 顯示值,最終在顯示屏上可見的值 x 傳輸值,和顯示屏通訊時傳輸的數值,一定是uint資料型別 k 解析度,該值確定了每個取值的...

TF IDF 文字的一種向量表示

tf idf是term frequency inverse document frequency的簡稱。她是一種非常常見的用於將文字轉化為有意義的數字表示的演算法。這個技術被廣泛的應用與nlp的各個方面。本文將會介紹怎樣計算和應用tf idf。為了將機器學習演算法或統計技術應用到任何形式的文字上,應...

一種asp分頁方法

webpagesize 10 每頁顯示的資訊數量 查表語句 sql select from topic set info server.createobject adodb.recordset info.open sql,conn,1,1 查表語句結束 分頁語句 page intsql reques...