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;
ここで何が問題になっていますか?また、このような変換が理想的にどのように実装されるのか知りたいですか?