【问题标题】:IEEE 754 to decimal in C languageIEEE 754 到 C 语言中的十进制
【发布时间】:2015-10-13 20:06:37
【问题描述】:

我正在寻找将浮点数转换为 C 中的十进制表示的最佳方法。我将尝试给您举个例子:用户在 IEEE754 (1 1111111 10101...) 和程序中引入了一个数字必须返回十进制表示(例如 25.6)
我尝试过使用掩码和按位运算,但没有得到任何合乎逻辑的结果。

【问题讨论】:

  • 为什么不使用标准库函数?
  • 我只能使用
  • 这实际上是一项不平凡的任务,因此对于 StackOverflow 问题来说过于宽泛。相关论文有:Guy L. Steele、Jon L. White:“如何准确打印浮点数”。 ACM SIGPLAN Notices,第 25 卷第 6 期,1990 年 6 月,第 112-126 页。 以及 Robert G. Burger, R. Kent Dybvig:“快速准确地打印浮点数”。在过程中。 ACM SIGPLAN '96 编程语言设计和实现会议,1996 年,第 108-116 页。
  • 看看那个标题里有什么然后:en.cppreference.com/w/c/io
  • 我可能误解了这个问题。正如所写的那样,它似乎向我暗示要手动完成转换,因为肯定任何 C 程序员都会知道printf()。如果问题是关于类型双关语,请使用 memcpy(),这在 C 和 C++ 中都是合法的,或者使用 union,这在 C99 中是合法的。

标签: c bit-manipulation decimal transform ieee-754


【解决方案1】:

我相信以下正在执行您描述的操作:

我使用int 作为中间表示,因为它具有与浮点数相同的位数(在我的机器上),并且它允许从二进制字符串轻松转换。

#include <stdio.h>

union {
    int i;
    float f;
} myunion;

int binstr2int(char *s)
{
    int rc;
    for (rc = 0; '\0' != *s; s++) {
        if ('1' == *s) {
            rc = (rc * 2) + 1;
        } else if ('0' == *s) {
            rc *= 2;
        } 
    }
    return rc;
}

int main(void) {

    // the input binary string (4 bytes)
    char * input = "11000000110110011001100110011010";
    float *output;


    // convert to int, sizeof(int) == sizeof(float) == 4
    int converted = binstr2int(input); 

    // strat 1: point memory of float at the int
    output = (float*)&converted; // cast to suppress warning
    printf("%f\n", *output); // -6.8

    // strat 2: use a union to share memory 
    myunion.i = converted; 
    printf("%f\n", myunion.f); // -6.8

    return 0;
}

正如@DanielKamilKozar 指出的那样,int 的正确类型是uint32_t。但是,这需要包含&lt;stdint.h&gt;

【讨论】:

  • int 不一定具有与float 相同的位数。 uint32_t 确实如此。
  • @DanielKamilKozar 你是对的,我已经添加了一条注释。只是试图保持在仅包含 &lt;stdio.h&gt; 的要求范围内
  • @DanielKamilKozar:如果我们学究气,我们就全力以赴:不能保证 float 是 IEE754 单精度浮点数。虽然我想我们可以说这是问题的先决条件......
  • @Deduplicator:对不起,你是对的。 float 类型以 IEEE754 单精度为前提。我之所以这么想是因为我认为它以这种方式包含在 C 的 C11 标准中
  • @Deduplicator: 更全面:哪个 IEE754 单精度浮点数:binary32decimal32?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
相关资源
最近更新 更多