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