截位(rnd/prnd/floor):都是去掉低位數據的操作(去掉低位低精度的數據,或者說小數位,降低數據的精度)
飽和(sat/sym_sat):都是去掉高位數據的操作,(去掉無符號數高位的0,或者有符號數高位多余的符號位)
函數說明:
floor:
1、這個操作很簡單,就是把低位直接截掉,精度損失大。有符號和無符號數據都適用用於這個函數,且不需要指示輸入的數據是有符號還是無符號。
prnd:
1、一種四舍五入處理,對於正數,是大於等於0.5就加1,否則去掉小數位;對於負數則是大於0.5就加1,否則去掉小數位。prnd(+x.5)=x+1、prnd(+x.499..99)=x、prnd(-x.5)=-x,prnd(-x.50.....01)=-(x+1)
2、prnd可以處理無符號和有符號數據,輸入要指示數據的類型,sign=0表示無符號,sign=1表示有符號數據。
3、prnd處理有加法操作,會擴寬數據位寬,比如一個6bit的數據,你想截掉低3位數據,那么輸出的數據位寬應該是4bit,OUT_DW = IN_DW - nBits + 1,4 = 6 - 3 + 1.
rnd:
1、一種四舍五入的處理,對於正數和負數都是小數大於等於0.5就加1,否則去掉小數位。rnd(+x.5)=x+1、rnd(+x.499..99)=x、rnd(-x.5)=-(x+1),rnd(-x.499...99)=-x
2、rnd的處理是關於原點對稱的,而prnd的處理不是關於原點對稱的。在ASIC處理中,prnd相對簡單些,rnd要復雜些,但是兩種處理后保留的精度是一樣的,不存在prnd好於rnd的說法。只有一些需要將數據處理成原點對稱,用於RM比較的時候才會用到rnd。比如RM的處理順序是先取反后截位,ASIC的處理是先截位后取反,這個時候截位就必須要使用rnd,因為取反是關於原點對稱的處理,rnd才有會有,-rnd(a)=rnd(-a)
3、rnd與prnd的唯一不同點就是在小數-0.5的截位上,prnd是截成-1,rnd是截成-2.
4、將數據分為保留部分preserve_part和截去部分cut_part
sat:
1、sat直接去掉有符號數的高位符號,或者無符號數據高位的0,如果發現溢出了,就把數據保持為最大的正數或者負數。
sym_sat:
1、相比sat,多了一個對稱的操作,就是數據如果是最大的負數要設為最大負數-1,負數溢出了也只保持到最大負數-1。這樣做的目的也rnd一樣,就是為了保證數據處理的對稱性。
RAND_SAT/LIB_CUT_SAT:
1、RAND_SAT類中,實現了基本的飽和截位處理,有的時候要連續使用兩種處理,且中間會有擴位,就把額外添加了一個LIB_CUT_SAT類。