首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEEE-754将在C中浮动

IEEE-754将在C中浮动
EN

Stack Overflow用户
提问于 2013-06-16 12:02:07
回答 2查看 470关注 0票数 3

我已经看过很多类似的问题,但我还没有找到解决方案。目前,输出为-1.978569,而不是-7.9142766。我正在尝试匹配此页面的输出:http://babbage.cs.qc.cuny.edu/IEEE-754.old/32bit.html

谢谢您抽时间见我!

下面是我的代码:

代码语言:javascript
复制
#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); }
EN

回答 2

Stack Overflow用户

发布于 2013-06-16 12:49:12

您有一些错误。

首先,您忽略了指数字段。它们位于位30-23中:

代码语言:javascript
复制
int exponentField = ((b[0] & 0x7F) << 1) + (b[1] >> 7);

其次,假设有一个前导1和重要的。(此外,只有23个有效位数,所以您的循环实际上应该只增加到23位,但由于您只是添加0,所以没有太大的关系。)如果将循环更改为以下内容:

代码语言:javascript
复制
float fraction = 1.0f;
unsigned char ii;
for (ii = 0; ii < 24; ++ii)
    fraction += ldexpf((fraction_bits >> (23 - ii)) & 1, -ii);

应该没问题。

最后,您需要考虑指数,该指数是从exponentField计算得出的

代码语言:javascript
复制
return ldexpf(significand, exponentField - 127);
票数 2
EN

Stack Overflow用户

发布于 2013-06-16 12:46:02

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17130086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档