3

我的程序从文件中读取 4 个字节的 IEEE 754 浮点数。我需要将这些字节可移植地转换为我的 C 编译器浮点类型。换句话说,我需要一个带有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 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 回答