3

私のプログラムは、ファイルから IEEE 754 浮動小数点数を 4 バイトに読み込みます。これらのバイトをCコンパイラのfloat型に移植可能に変換する必要があります。言い換えればfloat IEEE_754_to_float(uint8_t raw_value[4])、C プログラムのプロトタイプを持つ関数が必要です。

4

3 に答える 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 に答える