浮点数的运算原理--IEEE 754

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实做)。

    IEEE 754将存储浮点数的比特序列分为三个部分:符号位S,指数位E和尾数位M。根据规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M;对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。与浮点数对应数学值计算方法为:v=(-1)^s*M*2^E.

    为了便于比较两个浮点数的大小,指数部分采用无符号整数来存储,但是为了解决指数为负数的情况,IEEE 754规定,指数域的存储值为实际值和指数偏移量之和,指数偏移量的计算方法为2^(e-1) - 1,其中的e为存储指数的比特的长度。例如,如果指数域的长度为8,其存储值为129,那么该指数域对应的实际指数为129-(2^7-1)=2,此时,指数域的存储值范围为0~255,实际指数范围为-127~128.

   数字是怎样在浮点数中存储的哪?下面我们一步一步来演示一下:

   首先,将数字采用二进制格式的科学计数法进行表示,如123.625,转换为二进制科学计数法: 123.625(10进制)==》1111011.101(2进制)==》1.111011101*2^6。然后,将指数6与指数偏移量127相加,并填充指数域 6+127==>10000101。将1.111011101去除首部的1(任何二进制转换为科学计数法后,其整数部分必为1(尾数域范围为【1-2)),因此可以在尾数域中忽略该位,以便存储更多的数据,1.111011101===》111011101===》11101110100000000000000(填充0),将11101110100000000000000赋值到尾数域,那么此时,数值123.625的浮点数表示为: 01000010111101110100000000000000。

    按照相反的过程,我们可以推倒出 0 10000101 1110111010000000..===》0 134 1110111010000000... ==> 0 6 1.111011101==>1.111011101*2^6==>123.625

    如果浮点数的指数部分的编码值是0,尾数为非零,那么这个浮点数将被称为非规约形式的浮点数。IEEE 754标准规定:非规约形式的浮点数的指数偏移值比规约形式的浮点数的指数偏移值大1. 例如,最小的规约形式的单精度浮点数的指数部分编码值为1,指数的实际值为-126;而非规约的单精度浮点数的指数域编码值为0,对应的指数实际值也是-126而不是-127。非规约浮点数,在将其转换为数字时,是无需在尾数域的首部添加1的,即其尾数域取值范围为0~1,因此所有的非规约浮点数比规约浮点数更接近0。其转换过程如下: 0 00000000 11101110100000..===》0 -126 11101110100000... ==> 0 -126 0.111011101==>0.111011101*2^-126

    在将数字转换为浮点数时,往往不能完全匹配,例如,将0.1转换为二进制格式时其对应的比特位数远远超个了23位。有多种方法可以用来运行舍入作业,实际上IEEE标准列出4种不同的方法:       

    舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even)(这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中式以0结尾的)。
    朝+∞方向舍入:会将结果朝正无限大的方向舍入。
    朝-∞方向舍入: 会将结果朝负无限大的方向舍入。
    朝0方向舍入: 会将结果朝0的方向舍入。

    除此之外,浮点数还可以表示无穷大和非数值(Nan),以单精度浮点数为例,总结如下:

类别 正负号 实际指数 有偏移指数 指数域 尾数域 数值
0-12700000 0000000 0000 0000 0000 0000 00000.0
负零1-12700000 0000000 0000 0000 0000 0000 0000−0.0
1001270111 1111000 0000 0000 0000 0000 00001.0
-1101270111 1111000 0000 0000 0000 0000 0000−1.0
最小的非规约数*-12600000 0000000 0000 0000 0000 0000 0001±2−23 × 2−126 = ±2−149 ≈ ±1.4×10-45
中间大小的非规约数*-12600000 0000100 0000 0000 0000 0000 0000±2−1 × 2−126 = ±2−127 ≈ ±5.88×10-39
最大的非规约数*-12600000 0000111 1111 1111 1111 1111 1111±(1−2−23) × 2−126 ≈ ±1.18×10-38
最小的规约数*-12610000 0001000 0000 0000 0000 0000 0000±2−126 ≈ ±1.18×10-38
最大的规约数*1272541111 1110111 1111 1111 1111 1111 1111±(2−2−23) × 2127 ≈ ±3.4×1038
正无穷01282551111 1111000 0000 0000 0000 0000 0000+∞
负无穷11282551111 1111000 0000 0000 0000 0000 0000−∞
NaN*1282551111 1111non zeroNaN
* 符号位可以为0或1 .

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IEEE 754浮点数运算在Verilog中可以通过使用FPGA开发板来实现。FPGA开发板通常具有高性能和低功耗的特点,可以提供良好的硬件支持。 在Verilog中,可以使用IEEE 754浮点数标准定义数据类型,例如单精度浮点数(32位),双精度浮点数(64位)等。可以使用Verilog内置的运算符来进行浮点数的加、减、乘、除等运算,也可以使用Verilog中的模块来实现特定的浮点数运算,如乘法器、除法器等。 以下是一个使用Verilog实现单精度浮点数加法的例子: ```verilog module float_add(input [31:0] a, input [31:0] b, output [31:0] c); reg [31:0] mantissa_a, mantissa_b; reg [7:0] exp_a, exp_b; reg sign_a, sign_b; reg [31:0] mantissa_c; reg [7:0] exp_c; reg sign_c; assign sign_c = sign_a; assign mantissa_c = mantissa_a + mantissa_b; assign exp_c = exp_a; always @(*) begin sign_a = a[31]; sign_b = b[31]; mantissa_a = {1'b1, a[22:0]}; mantissa_b = {1'b1, b[22:0]}; exp_a = a[30:23] - 127; exp_b = b[30:23] - 127; end always @(*) begin if (mantissa_c[23] == 1) begin mantissa_c = mantissa_c >> 1; exp_c = exp_c + 1; end end always @(*) begin if (exp_a > exp_b) begin mantissa_b = mantissa_b >> (exp_a - exp_b); exp_c = exp_a; end else begin mantissa_a = mantissa_a >> (exp_b - exp_a); exp_c = exp_b; end end always @(*) begin if (sign_a != sign_b) begin if (mantissa_a > mantissa_b) begin mantissa_c = mantissa_a - mantissa_b; sign_c = sign_a; end else begin mantissa_c = mantissa_b - mantissa_a; sign_c = sign_b; end end else begin mantissa_c = mantissa_a + mantissa_b; end end always @(*) begin if (mantissa_c[24] == 1) begin mantissa_c = mantissa_c >> 1; exp_c = exp_c + 1; end end assign c = {sign_c, exp_c + 127, mantissa_c[22:1]}; endmodule ``` 该模块将两个单精度浮点数相加,并输出结果。在该模块中,首先将输入浮点数的符号、尾数和阶码分别提取出来,并进行规格化。然后对阶码和尾数进行调整,使它们的阶码相同,然后进行加法运算。最后再对结果进行规格化,并输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值