1

char配列に特定のバイナリ形式として格納されている浮動小数点数を読み取ろうとしています。形式は次のとおりです。各文字は2進数を表します。

SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

フォーマットはこのウェブサイトでより明確に説明されています。基本的に、指数はExcess-64表記であり、仮数は値<1および>1/16に正規化されます。数値の真の値を取得するには、仮数に16を掛けて、指数の真の値の累乗にします。

基本的に、これまでに行ったことは、符号と指数の値を抽出することですが、仮数を抽出するのに問題があります。私が試している実装は非常にブルートフォースであり、コードの観点からはおそらく理想からはほど遠いですが、私には最も単純な実装のように見えました。基本的には次のとおりです。

unsigned long a = 0;
for(int i = 0; i < 7; i++)
    a += static_cast<unsigned long>(m_bufRecord[index+1+i])<<((6-i)*8);

char配列に格納されている8ビットバイトサイズごとに取得し、配列内のインデックスに従って左にシフトします。したがって、私が持っている配列が次のようになっている場合:

{0x3f, 0x28, 0xf5, 0xc2, 0x8f, 0x5c, 0x28, 0xf6}

私はa値を取ることを期待しています:

0x28f5c28f5c28f6

ただし、上記の実装aでは次の値を取ります。

0x27f4c18f5c27f6

後で、次のコードを使用して長整数を浮動小数点に変換します。

double m = a;

m = m*(pow(16, e-14));
m = (s==1)?-m:m;

ここで何が問題になっていますか?また、このような変換が理想的にどのように実装されるのか知りたいですか?

4

1 に答える 1

1

私はあなたのコードを実行しようとはしていませんが、あなたがこれを得る理由は疑わしいです:

0x27f4c18f5c27f6

それ以外の

0x28f5c28f5c28f6

その前のセルに「負の数」があるためです。8ビットバイト配列は符号付きまたは符号なしの値ですか?署名なしにするとうまくいくと思います。[または、シフト操作の前になるようにキャストを移動します]。

于 2013-02-10T15:39:15.037 に答える