-1

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

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

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

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

我们是否执行以下操作

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

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

4

3 回答 3

1

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

于 2016-04-13T09:21:59.823 回答
0

两条评论。

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

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

于 2016-04-15T01:14:05.653 回答
0
******************************************************************************************
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
于 2016-04-30T11:29:28.387 回答