如何将存储IEEE 754浮点数的4个字节转换为C中的浮点值?

时间:2012-09-03 04:58:38

标签: c floating-point ieee-754

我的程序从文件中读取4个字节的IEEE 754浮点数。我需要将这些字节可移植地转换为我的C编译器浮点类型。换句话说,我需要一个带有原型float IEEE_754_to_float(uint8_t raw_value[4])的函数用于我的C程序。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

如果字节顺序相同,那么就像这样:

float f;
memcpy(&f, raw_value, sizeof f);
return f;

如果没有,请说:

float f;
char * p = (char *)&f;

现在根据需要手动填充字节p[0]

答案 2 :(得分: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);
}
相关问题