2016-04-13 11 views
-1

Ich arbeite an einem Digital Design-Projekt (Verilog) mit IEEE-Doppelpräzisions-Gleitkomma-Standard.Denormalisierung IEEE

Ich habe eine Frage in Bezug auf IEEE Floating Number Darstellung. In der IEEE Fließkommadarstellung werden die Zahlen im normalisierten Format dargestellt, was impliziert, dass das Signifikanzbit standardmäßig als 1 angenommen wird (auch bekannt als verdecktes Bit).

Wenn eine Gleitkommazahl de-normalisiert wird, wird das Signifikanzbit als 0 betrachtet und der Exponent wird durch Verschieben des Dezimalpunkts nach links auf 0 gesetzt.

Meine Abfrage betrifft De-Normalisierungsprozedur. Zum Beispiel, wenn der Exponent so hoch wie 120 sein kann, wie behandeln wir in einem solchen Fall die gebrochenen Bits (43 Bits für IEEE - doppelte Genauigkeit)?

Haben wir die folgende

1) Erhöhung der Breite der Fraktion tun? h. 43 Bruchbits + Entnormierung => 43 + z. B. 43 +120 = 163 Bits?

2) Einfach die Bits verschieben und die Breite des Bruches beibehalten, wie es ist? d. h. überschüssige Bits verwerfen?

Antwort

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

Die einzigen unnormierten Zahlen im IEEE-Binär-Gleitkomma sind diejenigen mit Null im Exponentenfeld, entsprechend dem kleinsten möglichen Exponenten. Sie behalten die normale Fraktionsbreite bei, so dass die Genauigkeit abnimmt, wenn die Anzahl der führenden Nullen zunimmt. Das ist eine gute Abwägung für kleine Zahlen, wodurch der Unterlauf glatter wird.

0

Zwei Kommentare.

Erstens, eine Fließkommazahl mit doppelter Genauigkeit (64 Bit) hat 52 explizite Bits für die Mantisse plus ein implizites Bit (nicht 43 Bit wie angegeben).

Zweitens werden nur Werte mit einem Exponenten mit allen Bits null als denormalisiert interpretiert. Dies ermöglicht eine Genauigkeit, die sich bei einem Wert von Null nahezu verschlechtert.

+0

ja, ich habe @ 43 getäuscht, ich meinte es ist 52. Danke Steve – Displayname