非规范化 IEEE

Denormalization IEEE

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

我有一个关于 IEEE 浮点数表示的问题。在 IEEE 浮点表示中,数字以规范化格式表示,这意味着默认情况下假定有效位为 1(也称为隐藏位)。

浮点数去规格化时,有效位为0,指数为0,小数点左移。

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

我们做以下事情吗

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

2) 简单地移动位并保持分数的宽度不变?即丢弃过多的位?

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

两条评论。

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

其次,只有具有全零指数的值才被解释为非规范化。这允许精度在值接近零时优雅地降低。

******************************************************************************************
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