什么是定點(diǎn)數(shù)
顧名思義,在運(yùn)算中小數(shù)點(diǎn)始終不會發(fā)生移動的數(shù)就是定點(diǎn)數(shù)。對于定點(diǎn)數(shù),我們定義了其一共占有的bit位數(shù)以及小數(shù)點(diǎn)的位置,不同格式的定點(diǎn)數(shù)可以表達(dá)的數(shù)據(jù)范圍和數(shù)據(jù)精度也會隨之不同。
通常采用
這樣的一種規(guī)范來表示定點(diǎn)數(shù)。其中s表示符號位,m表示字長,n表示整數(shù)字長。LabVIEW中定點(diǎn)數(shù)存儲空間,最大限定為64bit。
?
圖:有符號定點(diǎn)數(shù)表示方法
比如一個字長為8,整數(shù)字長為4的無符號定點(diǎn)數(shù),其表示方法為<+,8,4>,表示范圍從0—15.9375,增量值為0.0625。
?
圖:LabVIEW對于定點(diǎn)函數(shù)的即時幫助
為什么選擇定點(diǎn)數(shù)?
【效率高,占用資源較少】
一般說來,定點(diǎn)數(shù)的運(yùn)算在計(jì)算機(jī)中實(shí)現(xiàn)起來比較簡單,效率較高;而浮點(diǎn)數(shù)的運(yùn)算在計(jì)算機(jī)中實(shí)現(xiàn)起來比較復(fù)雜,效率相對較低。
?
圖:定點(diǎn)數(shù)以及單精度浮點(diǎn)數(shù)加乘運(yùn)算占用資源
【執(zhí)行時間短】
定點(diǎn)數(shù)的運(yùn)算可以在FPGA一個單周期定時循環(huán)(SCTL)中完成,但是如若想在單周期定時循環(huán)中執(zhí)行浮點(diǎn)運(yùn)算則會編譯失敗
定點(diǎn)數(shù)的max、min和delta的計(jì)算
定點(diǎn)數(shù)的max和min是由符號位,字長和整數(shù)字長共同決定的,而delta的大小卻與符號位無關(guān)。
我們定義一個定點(diǎn)數(shù)表示為<+,m,n>,當(dāng)m個全部字長都為1的時候,該值有最大取值;當(dāng)m個全部字長都為0的時候,該值為最小值。
?
圖:無符號定點(diǎn)數(shù)delta值表示
一個無符號定點(diǎn)數(shù)的最大值為 ,最小值為0,其增量值Delta為相似的,對于有符號的定點(diǎn)數(shù)來說,符號位為0,其余所有位為1時取最大值;符號位為1,其余所有位為0時,此時取最小值;其增量值Delta依然為。
定點(diǎn)數(shù)的運(yùn)算
【加法】
定點(diǎn)數(shù)在進(jìn)行相加的時候,對于<+, m, n> 與<+, m, n>進(jìn)行相加,用<+, m+1, n+1>是完全可以包含其所有可能結(jié)果的。也就是分?jǐn)?shù)部分位數(shù)不變,整數(shù)由于可能進(jìn)位,所以整數(shù)部分位數(shù)加1,字長也相應(yīng)加1。
?
圖:兩個相同配置的無符號定點(diǎn)數(shù)相加
如果Add節(jié)點(diǎn)兩端的定點(diǎn)數(shù)配置不同,分?jǐn)?shù)部分位數(shù)取A與B中較大值,整數(shù)部分位數(shù)取A與B中較大值+1,字長等于分?jǐn)?shù)位數(shù)與整數(shù)位數(shù)之和。
?
圖:兩個不同配置的無符號定點(diǎn)數(shù)相加
【減法】
無論減數(shù)和被減數(shù)是否有符號,其結(jié)果必然為有符號定點(diǎn)數(shù)。也就是兩配置為<+, m, n>的定點(diǎn)數(shù)相減,結(jié)果為<±,m+1, n+1>,當(dāng)然兩配置為<±,m, n>的定點(diǎn)數(shù)相減,結(jié)果依然為<±,m+1, n+1>。
?
圖:定點(diǎn)數(shù)的減法
【乘法】
定點(diǎn)數(shù)的乘法規(guī)則是<+, m, n>與<+, a ,b>相乘,結(jié)果為<+, m+a, n+b>。
?
圖:定點(diǎn)數(shù)的乘法
【除法】
被除數(shù)為最大值,且當(dāng)除數(shù)整數(shù)部分全為0,分?jǐn)?shù)部分為0….01這種形式的時候,能夠得到具有最大整數(shù)部分的結(jié)果,結(jié)果即為:
這個結(jié)果的整數(shù)部分位數(shù)為n+a-b。
綜上極限法判斷,得到結(jié)果的最大整數(shù)部分位數(shù)為n+a-b,最大分?jǐn)?shù)部分位數(shù)為m-n+b,字長即為二者之和為m+a。因此<+, m, n>與<+, a, b>相除的大結(jié)果的表達(dá)法為<+, m+a, n+a-b>。
同理,對于兩個有符號的定點(diǎn)數(shù)<±,m, n>與<±,a, b>進(jìn)行相除,結(jié)果表示為<±,m+a+1, n+a-b+1>。
圖:定點(diǎn)數(shù)的除法
定點(diǎn)數(shù)的溢出和湊整?
?
圖:定點(diǎn)數(shù)的溢出和湊整設(shè)置
【溢出】
當(dāng)定點(diǎn)數(shù)運(yùn)算后得到的值超過我們所配置的范圍,則會發(fā)生溢出。定點(diǎn)數(shù)運(yùn)算的溢出模式有飽和模式(Saturate)和繞回模式(Wrap)兩種。
飽和-如輸出值大于輸出類型可接受范圍的最大值,LabVIEW將強(qiáng)制將該值四舍五入至指定的最 大值。如該值小于可接受范圍的最小值,LabVIEW將值強(qiáng)制轉(zhuǎn)換為指定的最小值。
繞回-如輸出值在輸出類型可接受范圍之外,LabVIEW將舍棄輸出值的有效位,直到輸出值位于輸出類型的可接受范圍內(nèi)。該選項(xiàng)要求輸出值符合指定的編碼方式。如選擇該選項(xiàng)便無法指定可接受范圍,因?yàn)長abVIEW將自動使范圍符合編碼方式。
?
圖:定點(diǎn)數(shù)的溢出
飽和模式下需要完成一次數(shù)值的比較。這也是為什么選擇飽和模式將會占用FPGA額外的資源,也正是因?yàn)檫@個原因,飽和模式下的運(yùn)算將會降低最大時鐘速率。但是不難看出,飽和模式下的計(jì)算往往能夠獲得更加準(zhǔn)確的結(jié)果。
【湊整】
當(dāng)輸入值或運(yùn)算結(jié)果的精度大于輸出類型的精度時,將發(fā)生湊整。這種情況較多的發(fā)生在諸如除法,求倒數(shù)和平方根這些運(yùn)算上。
截?cái)嗌崛?Truncate)-向下湊整到輸出類型能表示的最近值。LabVIEW將舍棄該值的最低有效位。湊整模式的性能最佳,但得到的輸出值精度最低。
?
圖:截?cái)嗌崛?/strong>
半值向上(Round-Half-Up)-湊整到輸出類型能表示的最近值。如該值正位于兩個有效值之間,該模式將值湊整為兩個有效值中較大的一個。LabVIEW在輸出值上加上最低有效位的一半,然后截?cái)嘣撝?。這種湊整模式比截?cái)嗄J降妮敵鲋蹈鼫?zhǔn)確,但對性能影響較大。
?
圖:半值向上
奇偶舍入(Round-Half-Even)-取整到輸出類型能表示的最近值。如取整的值剛好在兩個有效值之間,LabVIEW將檢查該值中湊整后將成為最低有效位的位。如該位為0,該模式將把值湊整到兩個值中輸出類型能表示的較小的值。如該位不為0,該模式將值湊整到兩個有效值中較大的值。這種湊整模式對性能的影響最大,但其輸出值比截?cái)嗄J礁鼫?zhǔn)確。該模式也將中和進(jìn)行多次半值向上的取整后可能出現(xiàn)的趨向較大值的傾向。該模式為默認(rèn)的湊整模式。
?
圖:奇偶舍入
截?cái)嗌崛胧窍鄬π首罡叩囊环N模式,但是往往得不到最佳的精度。半值向上模式和奇偶舍入模式對比來看,二者精度可以說旗鼓相當(dāng),但是奇偶舍入模式能夠有效避免多次湊整可能會帶來的結(jié)果一直趨向較大值得趨勢,這種模式也是LabVIEW默認(rèn)的湊整模式。
更多信息請登陸NI官網(wǎng)
評論
查看更多