2016-05-08 12 views
1

私は現在仮想CPU用のエミュレータを作成中です。 CPUには、符号付きバイトまたは8ビット浮動小数点を表す16個の8ビット・レジスタがあります。8ビット浮動小数点表記の変換方法/変換方法は?

SByteとFByteの両方に、バイトメンバー変数が含まれています。

私は現在、以下のものを使用してバイトの浮動の実際の値を取得する方法を働いてきた:

FByte = SEEEEMMM 

value = (-1)^S + 1.M^(E-7) 

S = Sign bit 
M = Mantissa 
E = Exponent 

どのように私は行くだろうが(フロート表現に指定されたdouble値(例えば-3.562)に変換SEEEEMMMとして)。

ありがとうございます!

EDIT:私は現在、理論でこれを行う方法を知っています。ベース2の科学記法とバイナリ表現で記述しますが、私のプログラムではString操作を使用する必要があります。それの。

+1

文字列*をどのように取得するのか、コードを書く上で実際にどのような問題があるのか​​わかりません。 – EJP

+0

私は自分の電話機にいるので今説明するのは難しいですが、書かれた紙の方法のために私はこれを教えてくれました。つまり10進数から2進数に変換しています。 3.25 - > +11.01(これを他のデータ型で表現する方法がわからなかったので、My String intermediary)、浮動小数点をシフトして浮動バイトフォーマットに変換します。 –

答えて

4

あなたのフロート表現にdoubleを変換するための基本計画は、次のようになります。

  1. doubleToLongBitsを使用してlongdoubleを変換します。これにより、doubleのIEEE 754表現が得られます。
  2. doubleToLongBits結果のビット操作を使用してdoubleの部分を抽出します。ビット63は符号ビットである。ビット62-52はバイアスされた指数である。ビット51-0は仮数部である。
  3. 仮数の上位3ビット(元の浮動小数点のビット51-49)は、結果の3ビット仮数になります。ただし、元の浮動小数点のビット48が1の場合は、丸め処理の方法を決定する必要があります。ビット51-49が0b111で、丸めを行う必要がある場合は、仮数は[1].111から[1]0.000になります。つまり、右に1つ移動する([1].000を得る)必要があり、結果の指数に影響します。 (私は[1]を使用して仮数の暗黙の1ビットを示しています)
  4. 新しい指数を得るには、元のバイアスされた指数を取って1023を減算し、7を加算します。1023はIEEE 754 doubleのバイアスです。 7は浮動小数点型のバイアスのようです。結果は新しい指数になりますが、範囲外になる可能性があります。 [上に述べたように、切り上げた場合は新しい指数部にもう1を加えなければならないかもしれません。]
  5. 結果の符号ビットは元の符号ビットであるdoubleです。 (私はあなたが*の代わり+で、(-1)^S * 1.M^(E-7)する式を意味することを想定しています。)

doubleのフォーマットの詳細については、https://en.wikipedia.org/wiki/IEEE_floating_pointを参照してください。

関連する問題