3

我已经查看了许多类似的问题,但我还没有找到解决方案。目前,-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); }
4

2 回答 2

2

你有几个错误。

首先,您忽略了指数字段。这些在第 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-16T04:49:11.830 回答
1

指数位为 129,偏移 127 = 2。-1.978569 * (2 ** 2) = -7.9142766。

于 2013-06-16T04:46:01.637 回答