加减法:

一.将十进制数变为二进制数

十进制的小数转换为二进制,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。例如十进制的0.125,要转换为二进制的小数。
举例:
0.125(十进制变为二进制)
将小数部分0.125乘以2,得0.25,然后取整数部分0
再将小数部分0.25乘以2,得0.5,然后取整数部分0
再将小数部分0.5乘以2,得1,然后取整数部分1
则得到的二进制的结果就是0.001

二.把二进制数变为浮点数源

先将十进制转换后的二进制数调整尾数,比如:11.1001应该变成1.11001E+1。

三.套入单精度-默认空壳中

带入下图的单精度浮点数的空壳中,如上例中,符号位为0,价码为 0b01111111 + (E+1) = 0b10000000 ,尾数为11001。

     符号位             价码              尾数
A       【31】            【30:23】           【22:0】
B       【31】            【30:23】           【22:0】

四.操作数预处理

定义rA,rB把A和B中的数据存入,如图所示

      符号位[56]    价码[55:48]    隐藏位[47:46]   尾数[45:23]    尾数补偿[22:0]
rA      A[31]          A[30:23]      01           A[22:0]             23'd0
rB      B[31]          B[30:23]      01           B[22:0]             23'd0

五.价码对齐

设置寄存器rExp和rExpDiff。rExp = A[30:23] - B[30:23]; rExpDiff存rExp的正值。
寄存器 rExp 和 rExpDiff 均为 10 位,rExp 寄存 A 与 B 的价码差;rExpDiff 则寄存相 差位数。寄存器 rExp 之所以要声明为 10 位位宽,是为了判断价码差的符号位。如果 rExp[8]为 1 的话,说明价码差位负值,换句话说 A 的价码小于 B;如果 rExp[8]为 0, 说明 A 的价码大于还是等于 B。
if( rExp[8] == 1) 表示 A 的价码小于 B 的价码, 所以 A 必须向 B 对齐,rA 的尾数(包括补偿尾数)即 rA[47…0] 向右移 rExpDiff 位。 然后 rA 的价码即,rA[55:48]赋予 rB 的价码。
反之 B 必须向 A 对齐,rB 包括补偿尾数 移动 rExpDiff 位(rB[47:0]>>rExpDiff),然后 rB 的价码赋予 rA 的价码(rB[55:48]<< rA[55:48])。

六.尾数运算预处理

未执行加减运算之前,我们还要根据 rA 和 rB 的符号位,把 rA 和 rB 的尾数(包括尾数补偿)转换成补码与否。

           位【48】                      位【47:0】
TempA         rA【56】                 rA【47:46】(隐藏位) rA【46:0】
TempB         rA【56】                 rB【47:46】(隐藏位) rB【46:0】

需要对TempA和TempB进行补码转化。

七.加减法操作

Temp <= TempA + TempB,如图所示

八.结果预处理

isSign 赋予 Temp[48],Temp[48]则是加减结果的符号位。然后 判断 Temp[48]的符号位,如果为 1 的就正直化结果。最后更新 rExp 为 rA 的价码 (rB 的价码也是等价)。

           位【9:8】                             位【7:0】
rExp            00                              rA【55:48】 (价码)

九.结果调整

假定小数点Temp【47:46】.Temp【45:23】
调整过程如图所示:

除了结果的隐藏位为 2’b01 以外,其外都需要调整:
如果结果的隐藏位为 2’b11 那么尾数需右移 1 位,然后价码加 1;
如果结果的隐藏位为 2’b10 那么尾数需右移 1 位,然后价码加 1;
如果结果的隐藏位为 2’b00,但是第 45 位为 1,那么需尾数左移 1 位,然后价码减 1;
如果结果的隐藏位为 2’b00,但是第 44 位为 1,那么需尾数左移 2 位,然后价码减 2;
如果结果的隐藏位为 2’b00,但是第 43 位为 1,那么需尾数左移 3 位,然后价码减 3;

如果结果的隐藏位为 2’b00,但是第 24 位为 1,那么尾数需左移 22 位,然后价码减 22;
如果结果的隐藏位为 2’b00,但是第 23 位为 1,那么尾数需左移 23 位,然后价码减 23。

这个过程中会对价码进行改变,后面输出和格式需要进行判断

十.输出格式化

1.价码溢出
假设 rExp[9:8]为 2’b00,即表示价码没有溢出;
rExp[9:8]为 2’b01,即表示价码为上溢;
rExp[9:8]为 2’b11,即表示价码为下溢。
2.尾数零值
尾数零值仅是一个假想的错误状态,一般上单精度的浮点数无法表示 0 值,0 值在浮点 数中表示无穷大。尾数零值还有另一个可能是:当浮点数执行运算过后可能会发生尾数 全零的状态,举个例子 1.5E+2 减 1.5E+2。
除此之外,当运算结果使得精度非常非常小的时候,甚至超过单精度可以曾受的范围之内,我们也可以看成是尾数零值。
3.四舍五入
对于 2 进制来说四舍五入等价于“0 舍 1 入”。

如果 Temp[22]的值是 1 的话,那么 Temp[45…23]就加1,反之不然。

            位【31】          位【30:23】      位【22:0】
rResult        isSign         rExp【7:0】(价码)       尾数

十一.单精度浮点数转换为二进制数

1、分割数字的符号、阶码和有效数字;
2、将偏移阶码减去偏移,得到真正的阶码;
3、把数字写成规格化的二进制数形式

举个例子:
结果调整后:
Temp(A+B后的)=0 01 11100000000000000000000(经过了取反)
符号位为1,隐藏位为01,价码为10000000
所以:
rResult=32’b1_10000000 11100000000000000000000
还原阶码:10000000 – 01111111=1
该浮点数的二进制规格化形式:1.111×E1 (其中前面的“1.”从隐含位而来)

十二.二进制数转换为十进制

1、把规格化的二进制数改变成非规格化的二进制数;
2、把非规格化的二进制数转换成十进制数。
二进制为1.111×E1
尾数调整后,非规格化二进制数为:11.11
小数点前转化为:1+12=3
小数点后转化为:1
1/2+1*1/4=0.75
由于符号位为1
所以结果为-3.75

乘法:

一.操作数预处理

      位【32】   位【31:24】  位【23】 位【22:0】
rA        A【31】  A【30:23】      1     A【22:0】
rB        B【31】    B【30:23】      1     B【22:0】

rA<= {A[31],A[30:23], 1’b1,A[22:0]};
rB<= { B[31], B[30:23], 1’b1, B[22:0]}

A,B与加法中一致

二.符号位运算

符号位的运算可以用亦或取得。

isSign <=A[31] ^ B[31];

三.移位预操作

根据某个“特殊条件”,把操作数 B 的小数点左移 1 位,然后价码递增 1,在移位过程中包括隐藏位。
特殊条件:操作数组价码等价,但是双反尾数同不等于 0

if(rA[31:24]==rB[31:24]&&(rA[22:0]!=23'd0&rB[22:0]!=23'd0))beginrB[31:24]<=rB[31:24]+1'b1;rB[23:0]<=rB[23:0]>>1;end

四.价码和尾数运算

价码相加,尾数相乘,因为指数需要相加

BDiff= rB[31:24] - 8'd127; // + (~8'd127 + 1)
rExp <= rA[31:24] + BDiff;//A.Exp + B.Exp
Temp <= rA[23:0] * rB[23:0];

五.结果调整

Temp为【47:0】,没有符号位

begin if(Temp[47]==1'b1)beginTemp<=Temp;end elseif(Temp[46]==1'b1)beginTemp<=Temp<<1;end elseif(Temp[45]==1'b1)beginTemp<=Temp<<2;rExp<=rExp-1'b1;end
end

这里需要注意的是价码的改变,并且调整范围没有加减运算的大。

六.输出和格式化

在这个步骤中,我们同样要检查价码溢出或者尾数零值等错误信息以外,我们要四舍五入尾数的结果。

begin if( rExp[9:8] == 2'b01 ) begin isOver <= 1'b1; rResult <= {1'b0,8'd127, 23'd0}; end  // E Underflowelse if( rExp[9:8] == 2'b11 ) begin isUnder <= 1'b1; rResult <= {1'b0, 8'd127, 23'd0}; end // E Underflow else if(Temp[47:24] == 24'd0 ) begin isZero <= 1'b1; rResult <= {1'b0, 8'd127, 23'd0}; end // M Zero else if(Temp[23] == 1'b1 ) rResult <= { isSign, rExp[7:0],Temp[46:24] + 1'b1 }; else rResult <= { isSign, rExp[7:0], Temp[46:24] };
end

除法

一.操作数预处理

      位【32】   位【31:24】  位【23】 位【22:0】
rA        A【31】  A【30:23】      1     A【22:0】
rB        B【31】    B【30:23】      1     B【22:0】

rA<= {A[31],A[30:23], 1’b1,A[22:0]};
rB<= { B[31], B[30:23], 1’b1, B[22:0]}

二.运算

操作数 A 的尾数左移24位,操作数B的尾数右移24位,对于单精度格式的来说这种程度的马力已经足够满足运算。

begin isSign<=A[31]^B[31];BDiff=rB[31:24]-8'd127; rExp<=rA[31:24]-BDiff;Temp<={rA[23:0],24'd0}/{24'd0,rB[23:0]};
end

三.结果调整

如果操作数为24位,马力为24档位,左移23位的话,价码不变化,左移24位,价码减1。

beginif(Temp[25]==1'b1)beginTemp<=Temp<<22;end elseif(Temp[24]==1'b1)beginTemp<=Temp<<23;end elseif(Temp[23]==1'b1)beginTemp<=Temp<<24;rExp<=rExp-1'b1;end
end

四.输出格式化

在输出和格式化这个步骤中,浮点乘法和浮点除法的内容基本上是大同小异,因为浮点除法和浮点 乘法都一样,我们“假定”小数点介于 Temp[47]-Temp[46]之间。不过有一点读者会吓到的是, 浮点除法少了四舍五入这个操作,为什么呢?有两种原因,第一个原因是经过结果调整以后,Temp[23]~Temp[0] 很大可能是全零。另一个原因是,在尾数运算途中保护精度的措施已经最大发 挥了,所以四舍五入操作显得有点鹌鹑,因此就被节了。

beginif(rExp[9:8] == 2'b01 )begin isOver <= 1'b1; rResult <= {1'b0,8'd127, 23'd0}; end else if(rExp[9:8] == 2'b11) begin isUnder <= 1'b1; rResult<= {1'b0, 8'd127, 23'd0}; end else if(Temp[47:24] == 24'd0) beginisZero <= 1'b1; rResult<= {1'b0, 8'd127, 23'd0}; end elserResult <= { isSign,rExp[7:0],Temp[46:24]};
end

单精度浮点数的数学计算相关推荐

  1. 【软考学习3】数据表示——浮点数计算 + 单精度浮点数IEEE754计算

    浮点数计算在软考中的考查形式一般为选择题,要求选择正确的或者错误的是什么,所以需要学习浮点数的基本运算流程. 另外在本科<计算机组成原理>中还学过 IEEE754单精度 浮点数运算,所以一 ...

  2. 关于单精度浮点数的计算

    IEEE754规定: 单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127:双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023 约定小数点左边隐含有一位,通常这位数是 ...

  3. js 单精度浮点数转10进制_确保前端 JavaScript 浮点数精度的四则运算方法

    1 浮点数运算与 IEEE 754 标准 在 JavaScript 中,执行 0.1+0.2,得到的结果却是 0.30000000000000004.这就不得不提到 IEEE 754 标准. IEEE ...

  4. 为什么单精度浮点数的精度是7位

    文章目录 起因 浮点数的精度 IEEE754表示 测试 浮点数运算 浮点数精度 我的理解 自己的理解 总结 参考 起因 今天遇到一个问题,角色卡在一个模型边上,在PVD看模型也比较正常.最终原因呢是因 ...

  5. matlab的单精度浮点数,浮点数的表示和精度_单精度浮点数的表示

    浮点数的表示和精度 如果a>0,那么1+a一定大于1吗?在数学上,答案是肯定的.但在计算机上,答案就与a的大小和浮点数的精度有关了.在matalb上,可以作以下计算: >> a=1/ ...

  6. 单精度浮点数的取值,表示以及相关

    取值范围及精度 可以表示的范围为±3.40282 * 10^38(1.1111-1×2^127)即: 0-11111110-11111111111111111111111(23个1) 单精度浮点数可以 ...

  7. js函数语法:ASCII 码的相互转换,字符串操作,数学计算

    ASCII 码的相互转换 for (let i = 'a'.charCodeAt(); i <= 'z'.charCodeAt(); i++) {a.push(String.fromCharCo ...

  8. Shell脚本笔记(三)shell中的数学计算

    shell中的数学计算 一.使用方括号 #!/bin/bash a=10 b=29 c=88res=$[$a * ($c-$b)] echo $res 二.使用(()) echo $((1+9)) ( ...

  9. python数值运算答案_笨方法学Python 习题3:数字和数学计算

    数字和数学计算 print("I will now count my chickens") print("Hens",25+30/6) print(" ...

最新文章

  1. 既可生成点云又可生成网格的超网络方法 ICML
  2. 下载Android源码流程(完整版)
  3. 专题 17 SOCKET并发程序设计
  4. Linux下安装mysql遇到的一些问题及解决办法
  5. mysql zf,mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI的含义
  6. qt creator无法删除文件怎么办?(需要在cmakelists文件里配置)
  7. git 代码推送流程_Git 101:一个让您开始推送代码的Git工作流程
  8. git bash卡顿解决
  9. 2345王牌浏览器网页加载慢怎么办 网页加载慢解决
  10. 11月25日发!余承东官宣华为Mate新成员:最强悍高端平板?
  11. IDEA两步删除版本控制
  12. 计算机感染冲击波,CIH、爱虫、冲击波、熊猫烧香,对这4种网络病毒你了解多少?...
  13. mimics能导出什么格式_Mimics到底支持怎样的图像格式(修正版)
  14. DelayQueue 分析
  15. PS基础教程:[8]蒙版使用实例
  16. ubuntu16.04使用360随身wifi2代
  17. EtherCAT运动控制卡的电子凸轮追剪飞剪等应用(一)
  18. H3C无线AC+AP配置2—有密码登录
  19. 【selection】 学习光标API并实现编辑区插入表情图片的功能
  20. 设计模式是什么鬼(抽象工厂)

热门文章

  1. Ventuz教程学习笔记之介绍
  2. ValueError: Expected 2D array, got 1D array instead
  3. excel减法函数_Excel基础知识-四则运算(函数篇)
  4. appium+pytest实现APP并发测试
  5. Java EE Design Patter
  6. 中亦科技将二度上会:八成收入来自金融,研发、销售投入有待平衡
  7. 展讯(SPRD)WRE学习-1
  8. linux中rm命令的功能,Linux中的rm命令
  9. Python scapy的简单使用
  10. 戴森《2022年全球头发研究报告》重磅发布 未来拟斥资5亿英镑实现20项全新科技