2016-04-13 2 views
-1

Я работаю над проектом Digital Design (Verilog) с использованием стандарта двойной точности IEEE с плавающей запятой.Denormalization IEEE

У меня есть запрос относительно представления чисел с плавающей точкой IEEE. В представлении с плавающей запятой IEEE цифры представлены в нормализованном формате, что подразумевает, что бит значащего считается равным 1 по умолчанию (также известный как скрытый бит).

Когда число с поплавком ненормировано, значащий бит считается 0, а показатель экспоненты 0, сдвигая десятичную точку налево.

Мой запрос касается процедуры де-нормализации. Например, если показатель может достигать 120, в таком случае, как мы будем обрабатывать дробные биты (43 бит для IEEE - двойная точность)?

ли мы следующие

1) Увеличение ширины фракции? то есть 43 бит фракции + де-нормализация => 43 + например 43 +120 = 163 бит?

2) Просто сдвиньте биты и сохраните ширину дроби, как есть? т.е. отбрасывать избыточные биты?

ответ

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; 

[email protected](*) 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 
1

Единственными ненормализованными числами в двоичной плавающей точке IEEE являются те, которые имеют нуль в поле экспоненты, соответствующие наименьшему возможному экспоненте. Они сохраняют нормальную ширину фракции, так как число ведущих нулей увеличивает точность. Это хороший компромисс для крошечных номеров, что делает поток более гладким.

0

Два комментария.

Во-первых, число с плавающей запятой с двойной точностью (64-разрядное) имеет 52 явных бита для мантиссы плюс один подразумеваемый бит (не 43 бит, как вы указали).

Во-вторых, только значения с показателем с полным битом-нолем интерпретируются как денормализованные. Это позволяет точно грациозно деградировать, поскольку значения приближаются к нулю.

+0

Да, я goofed up @ 43, я имел в виду, что это 52. Спасибо Стив – Displayname

Смежные вопросы