【问题标题】:Denormalization IEEE非规范化 IEEE
【发布时间】:2016-04-13 05:26:26
【问题描述】:

我正在从事一个涉及 IEEE 双精度浮点标准的数字设计项目 (Verilog)。

我对 IEEE 浮点数表示有疑问。在 IEEE 浮点表示中,数字以标准化格式表示,这意味着默认情况下假定有效位为 1(也称为隐藏位)。

当浮点数被反规范化时,有效位被认为是0,并且通过将小数点左移来使指数为0。

我的问题是关于反规范化过程。例如,如果指数可以高达 120,在这种情况下,我们如何处理小数位(IEEE 为 43 位 - 双精度)?

我们做以下事情吗

1) 增加分数的宽度?即 43 小数位 + 反规范化 => 43 + 例如 43 +120 = 163 位?

2) 只需移动位并保持小数的宽度不变?即丢弃过多的位?

【问题讨论】:

    标签: floating-point verilog ieee-754 digital-design


    【解决方案1】:

    IEEE 二进制浮点中唯一的非规范化数字是那些在指数字段中为零的数字,对应于可能的最小指数。它们保持正常的分数宽度,因此随着前导零数量的增加,精度会降低。对于小数来说,这是一个很好的折衷方案,使下溢更平滑。

    【讨论】:

      【解决方案2】:

      两个厘米。

      首先,双精度(64 位)浮点数的尾数有 52 个显式位,加上一个隐含位(不是您所说的 43 位)。

      其次,只有所有位为零指数的值才被解释为非规范化的。这允许精度随着值接近零而优雅地降低。

      【讨论】:

      • 是的,我搞砸了@ 43,我的意思是 52。谢谢史蒂夫
      【解决方案3】:
      ******************************************************************************************
      HERE IS THE CODE I IMPLEMENTED FOR DENORMALIZATION OF A IEEE 754 DOUBLE PRECISION NUMBER
      ******************************************************************************************
      
      module denorm_orig(D_in, Dnorm); 
      
      input  [63:0]D_in;        // In IEEE 754 double precision format 
      output reg [63:0]  Dnorm;  
      
      reg [63:0] fract_U1;
      reg [10:0] exponent_U1;
      
      always@(*) begin
      
      fract_U1 = {1'b1,D_in[51:0],11'b0};           // Fraction part - denormalized 64 bits 
      exponent_U1  = (11'd1022- D_in[62:52]);       // Exponent part 
      
      fract_U1 = (exponent_U1[5])?{32'b0,fract_U1[63:32]}: {fract_U1 };   // Check if this (32nd or 5th) bit is zero , if not zero , then  keep the value as it is 
      fract_U1 = (exponent_U1[4])?{16'b0,fract_U1[63:16]}: {fract_U1 };   
      fract_U1 = (exponent_U1[3])?{ 8'b0,fract_U1[63:8 ]}: {fract_U1 };   
      fract_U1 = (exponent_U1[2])?{ 4'b0,fract_U1[63:4 ]}: {fract_U1 };   
      fract_U1 = (exponent_U1[1])?{ 2'b0,fract_U1[63:2 ]}: {fract_U1 };   
      fract_U1 = (exponent_U1[0])?{ 1'b0,fract_U1[63:1 ]}: {fract_U1 };   
      
      Dnorm = fract_U1 [63:55];
      
      end
      
      endmodule
      

      【讨论】:

        猜你喜欢
        • 2013-02-14
        • 2013-12-02
        • 2011-12-28
        • 2013-08-21
        • 2016-05-13
        • 2018-06-06
        • 2021-06-13
        • 2020-04-06
        • 1970-01-01
        相关资源
        最近更新 更多