私のプログラムは、ファイルから IEEE 754 浮動小数点数を 4 バイトに読み込みます。これらのバイトをCコンパイラのfloat型に移植可能に変換する必要があります。言い換えればfloat IEEE_754_to_float(uint8_t raw_value[4])
、C プログラムのプロトタイプを持つ関数が必要です。
質問する
7390 次
3 に答える
5
実装が正しいエンディアンを保証できる場合:
float raw2ieee(uint8_t *raw)
{
// either
union {
uint8_t bytes[4];
float fp;
} un;
memcpy(un.bytes, raw, 4);
return un.fp;
// or, as seen in the fast inverse square root:
return *(float *)raw;
}
于 2012-09-03T05:08:29.717 に答える
2
エンディアンが同じ場合は、次のようになります。
float f;
memcpy(&f, raw_value, sizeof f);
return f;
そうでない場合は、次のように言います。
float f;
char * p = (char *)&f;
p[0]
そして、必要に応じて手動でバイトを入力します。
于 2012-09-03T05:06:18.220 に答える
0
これは、IEEE_754 数値を C コンパイラの float 値にポータブルに変換するソリューションです。このコードは機能しますが、分数の値を取得するためのループは醜いので、もっとうまくやることができます。同様に、このコードは無限大や数値などの特殊なケースを処理しません。
float IEEE_754_to_float(const uint8_t raw[4]) {
int sign = (raw[0] >> 7) ? -1 : 1;
int8_t exponent = (raw[0] << 1) + (raw[1] >> 7) - 126;
uint32_t fraction_bits = ((raw[1] & 0x7F) << 16) + (raw[2] << 8) + raw[3];
float fraction = 0.5f;
for (uint8_t ii = 0; ii < 24; ++ii)
fraction += ldexpf((fraction_bits >> (23 - ii)) & 1, -(ii + 1));
float significand = sign * fraction;
return ldexpf(significand, exponent);
}
于 2012-09-03T19:42:27.493 に答える