fpga——浮点数加减法

算法:
公式:表示的浮点数大小是:X=(-1)^sign * 1.fraction * 2^(exponent - bias)。
sign=正负(0为正,1为负)
fraction=X转成二进制后除去第一位后的数字
Bias=单精度是127/双精度是1023
exponent= bias+(X的二进制移位成1.fraction的移位数)
尾数=1.fraction
范例:
以32位单精度浮点数为例(float),其具体的转换规则是:
首先把二进制小数(补码)用二进制科学计数法表示,

        以十进制下的12.5为例,首先12.5非负,所以符号位为0;
           12.5转换为二进制,1100.1;
           将其科学计数法化(正规化),变成了 1.1001*2^(3);
           可知道此时2的指数为3,加上预设的偏移值127,得到了130,即1000 0010;这就是指数部分。
          (1.1001)去掉整数得到尾数1001,剩余尾数补0,这就是尾数部分。
           以最终的IEEE754单精度值(32位)为 
                 0    100 0001 0   100 1000 0000 0000 0000 0000
                符号 【指数部分】 【尾数部分(23位)          】 
           整合为16进制,为41 48 00 00 。
           
        再以-0.375为例,符号位为1;
             0.375转换为二进制,0.011,科学计数法化(正规化),1.1*2^(-2) 
             可知2的指数位-2,加上127为125,即0111 1101;
            (1.1)去掉整数得到尾数1,剩余尾数补0
             最终为1 0111 1101 1000 0000 0000 0000 0000 000
             整合为16进制,为BE C0 00 00。

加法: 1.首先统一指数部分,将小的忘大的地方变,加多少则尾数右移多少,减多少则尾数左移多少;
(注)即(1) 0011 0011 0011 0011 0011 001 -> (0) 1001 1001 1001 1001 1001 100
尾数相加得到结果的尾数。
范例:
0.3= 1.0011 0011 0011 0011 0011 001

     0.3= 0 011 1110 1 001 1001 1001 1001 1001 1001  
              125
     0.7= 1.0110 0110 0110 0110 0110 011
     
     0.7= 0 011 1111 0 011 0011 0011 0011 0011 0011
              126         
     0.3右移一位
       (1) 0011 0011 0011 0011 0011 001 -> (0) 1001 1001 1001 1001 1001 100
     
     尾数相加0.100 1100 1100 1100 1100 1100 + 1.011 0011 0011 0011 0011 0011
             = 1.111 1111 1111 1111 1111 1111 
     实际数据是 
               0 011 1111 0 111 1111 1111 1111 1111 1111 
               X=(-1)^0 * 1.111 1111 1111 1111 1111 1111 * 2^(126 - 127)
                = 0.99999994039536
                =1(四舍五入)
   注意:如果是正负相加,负数需要取补码进行相加操作,并扩展符号位,
         观察结果的正负性;如果结果的整数部分大于1,要进行科学计数法化(正规化)。 

浮点数乘法:
1.尾数相乘,得到结果,以12.5和-0.375为例,相关的浮点数表示在介绍IEEE754环节已给出;
12.5 ->41 48 00 00 ; -0.375 -> BE C0 00 00
12.5=1.1001*2^3

       12.5  =0 100 0001 0 100 1000 0000 0000 0000 0000
       X=(-1)^0 * 1.100 1000 0000 0000 0000 0000 * 2^(130 - 127)。/3
       
       -0.375=1.1*2^(-2)
       -0.375=1 011 1110 1 100 0000 0000 0000 0000 0000
       X=(-1)^1 * 1.100 0000 0000 0000 0000 0000 * 2^(125 - 127)。/-2  
            
       1.1001*1.1=10.01011000  /1
       
     2.计算两者的exponent差值,得到结果3-2=1;将1中的结果科学计数法化(正规化),
       10.01011000=1.001011000*2^1
       得到最终的exponent为127+1+1=129;
     3.将两者的符号位做异或计算,得到结果1,
       所以最终结果的符号位为1;
       最终结果为C0 96 00 00,转换为10进制就是-4.6875 。
       -4.6875=1 100 0000 1 001 0110 0000 0000 0000 0000

ip调用:floating-point

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值