首页 > 其他分享 >verilog实现 floor, round 四舍五入 和 saturation 操作

verilog实现 floor, round 四舍五入 和 saturation 操作

时间:2023-11-28 11:24:50浏览次数:34  
标签:四舍五入 saturation 15 temp 22 floor 31 round

floor, round和saturation是进行bit位削减时常用的方法,floor 和round用于削减低位,saturation用于削减高位。floor和round的区别在于,floor是将低位直接丢掉,而round则是在丢掉低位前先进行四舍五入。round和saturation的使用范例如下:   假设有一个32bit有符号数a[31:0], 其低10bit为小数部分,高22bit为整数部分。如果现在我们需要用一个16bit的整数来尽可能精确地表示a[31:0]。则需要截去全部的小数部分和高6位的整数部分,具体步骤如下:   step1. 用round去掉小数部分并进行四舍五入。

assign add_bit          = a[31] ? (a[9] & (|a[8:0]) ) : a[9];
assign temp[22:0] = {a[31],a[31:10]} + add_bit;

 

分析:第一句判断是否需要进位。设要舍弃部分的值为d, (-1.0<d<1.0)。当a为正,即a[31] = 0时,若a[9]=1, 则说明d>0.5,故可以产生进位。当a为负,即a[31] = 1时,由于负数用补码表示,若直接舍弃d则意味着round up, 即向高位进位。然而,当0>d>-0.5时,不需要进位,而对于补码表示的负数而言,add_bit=1即表示不产生进行。另外,0>d>-0.5即a[9] & (|a[8:0]),因为 - 0.5的补码是10_0000_0000, d>-0.5即a[8:0]不全为0。考虑到四舍五入时可能产生进位,故需要扩展1bit的符号位。   step2. 用saturation去掉temp[22:0]的高7位从而得到16bit的最终结果。 复制
assign res[15:0] = (&temp[22:15]) | !(|temp[22:15]) ? temp[15:0] : {temp[22], {15 { !temp[22] } } }

 

分析:首先判断temp[22:15]是否为全0或全1,若是,则说明其全部为符号位,我们只需要保留temp[15]作为符号位,其余高位bit可以直接丢掉。若temp[22:15]既不是全0又不是全1,则说明temp[22:15]包含数据位,即此时temp[22:0]的值已经超出了16bit有符号数所能表示的最大,此时必然会引入精度丢失问题,为了尽可能提高精度,只能将res[15:0]设置为其所能表示的最大值0x7FFF(temp[22] = 0)或0x8000(temp[22] = 1)。
 

标签:四舍五入,saturation,15,temp,22,floor,31,round
From: https://www.cnblogs.com/yanghonker/p/17861462.html

相关文章

  • C# double decimal 四舍五入
    传送门usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;publicclassProgram{publicstaticvoidMain(){//先看看double类型通过Math.Round取两位小数得到什么Console.WriteLine(Math.Round(2.345d,2));//2.35//再看看de......
  • 无涯教程-Dart - Floor函数
    此方法返回小于或等于数字的最大整数。Floor-语法Number.floor()Floor-返回值返回小于或等于数字x的最大整数。Floor-示例voidmain(){vara=2.9;print("HiLearnfkThefloorvalueof2.9=${a.floor()}");}它将产生以下输出-HiLearnfkThefloor......
  • C#中Math.Round(指定四舍五入)、Math.Ceiling和Math.Floor的用法
    1.Math.Round:四舍六入五取偶Math.Round(17.475728155339805,2,MidpointRounding.AwayFromZero)=17.48Math.Round(0.0)//0Math.Round(0.1)//0Math.Round(0.2)//0Math.Round(0.3)//0Math.Round(0.4)//0Math.Round(0.5)//0Math.Round(0.6)//1Math.Round(0.7)//1Math.Round(0......
  • Linux-Shell 小数运算,四舍五入
    在shell中做小数运算,可以借助bc或者awk工具一、使用bc做小数运算,scale指定小数点位数1、加法运算(scale参数无效)#echo"5.999+5.001"|bc6.000#echo"5.111+5.1114"|bc10.2224运算结果小数点位数以加数中最大的为准 2、减法运算(scale参数无效)  同加法运算  运算......
  • 四舍五入的数字 round(列名,小数点位数)
    selectsalas'原始数据',round(sal)as'四舍五入后的数据',round(sal,1)as'四舍五入1个小数点后的数据'fromemp;   ......
  • JS 数字类型的加减乘除, 四舍五入保持精度
    Number.prototype.toFixed=function(d=0){ letchangeNum=this+''//把数字转为字符串 if(changeNum.indexOf('-')!=-1){//判断是否是负数 changeNum=Math.abs(Number(changeNum))} changeNum=(Math.round(Number(changeNum)*Math.......
  • C++四舍五入
    C++四舍五入1.利用C++输出函数cout<<setprecision(4)<<1.94999<<endl;只使用setprecision:控制浮点数的输出位数,注意控制的是总输出的数字个数,不是小数点后,并且将默认将小数后面的末尾0省略,并且将四舍五入cout<<fixed<<setprecision(2)<<1.48999<<endl;使用fixedsetprecisi......
  • 四舍五入的死磕
    num=34564999pos='万'UserPos=['个','十','百','千','万','十万','百万','千万','亿','十亿','百亿','千亿']MyStr=str(num)ifint(MyS......
  • 四舍五入为什么"不科学"
    先来介绍一下常见的四舍五入,四舍五入其实是把[0,10)这个区间分成了[0,5)和[5,10)两个区间,这两个区间长度相同,所以如果随机取一个数,落在这两个区间上的概率是相等的,所以这其实是一种非常公平的舍入规则,并不存在不科学的情况,但在实际情况下,四舍五入其实是会把数值估计大的,而四舍六入......
  • js 四舍五入toFixe和Math.round(
    toFixed四舍五入偶尔不正确的问题原因:因为toFixed是一个四舍六入五成双的方法四舍六入好理解,那什么叫五成双呢"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)(0.5251).toFixed(2)=>0.53......