我已经看过很多类似的问题,但我还没有找到解决方案。目前,输出为-1.978569,而不是-7.9142766。我正在尝试匹配此页面的输出:http://babbage.cs.qc.cuny.edu/IEEE-754.old/32bit.html
谢谢您抽时间见我!
下面是我的代码:
#include <stdio.h>
#include <math.h>
float IEEE_754_to_Float(const unsigned char b[4]) {
int sign = (b[0] >> 7) ? -1 : 1;
unsigned int fraction_bits = ((b[1] & 0x7F) << 16) + (b[2] << 8) + b[3];
float fraction = 0.5f;
unsigned char ii;
for (ii = 0; ii < 24; ++ii)
fraction += ldexpf((fraction_bits >> (23 - ii)) & 1, -(ii + 1));
float significand = sign * fraction;
return ldexpf(significand, 1);
}
int main() {
unsigned char b[]={0xC0, 0xFD, 0x41, 0xC1};
float f=IEEE_754_to_Float(b);
printf("%f\n",f);
return(0); }发布于 2013-06-16 12:49:12
您有一些错误。
首先,您忽略了指数字段。它们位于位30-23中:
int exponentField = ((b[0] & 0x7F) << 1) + (b[1] >> 7);其次,假设有一个前导1和重要的。(此外,只有23个有效位数,所以您的循环实际上应该只增加到23位,但由于您只是添加0,所以没有太大的关系。)如果将循环更改为以下内容:
float fraction = 1.0f;
unsigned char ii;
for (ii = 0; ii < 24; ++ii)
fraction += ldexpf((fraction_bits >> (23 - ii)) & 1, -ii);应该没问题。
最后,您需要考虑指数,该指数是从exponentField计算得出的
return ldexpf(significand, exponentField - 127);发布于 2013-06-16 12:46:02
指数位是129,偏移127 = 2. -1.978569 * (2 ** 2) = -7.9142766。
https://stackoverflow.com/questions/17130086
复制相似问题