2016-04-13 21 views
-1

私はIEEEの倍精度浮動小数点標準に関するデジタルデザインプロジェクト(Verilog)に取り組んでいます。非正規化IEEE

IEEE浮動小数点表現に関する質問があります。 IEEE浮動小数点表現では、数値は正規化された形式で表されます。これは、仮数ビットがデフォルトでは1(仮ビットとも呼ばれます)とみなされることを意味します。

浮動小数点数が正規化されていない場合、仮数ビットは0とみなされ、指数は小数点を左にシフトすることによって0になります。

私のクエリは、正規化解除手順に関するものです。たとえば、指数が120まで高くなる可能性がある場合、そのような場合、小数点ビット(IEEE - 倍精度の場合は43ビット)をどのように処理するのでしょうか?

たちは分数の幅を増やす)

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 2進浮動小数点の非正規化数は、可能な限り小さい指数に対応する指数フィールドにゼロを持つ数だけです。それらは通常の小数部の幅を保持します。先行するゼロの数が増えると精度が低下します。これは小さな数値のトレードオフであり、アンダーフローをスムーズにします。

0

2件のコメントです。

第1に、倍精度(64ビット)の浮動小数点数は、仮数部の52個の明示的なビットと1つの暗黙のビット(指定したとおり43ビットではありません)です。

第2に、全ビットがゼロの指数を持つ値のみが非正規化として解釈されます。これにより、値がゼロに近づくにつれて、精度が正常に低下します。

+0

はい、私は43になってしまいました。私はそれが52であることを意味しました。 – Displayname

関連する問題