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...