【问题标题】:arithmetic operations using float binary "0b"使用浮点二进制“0b”的算术运算
【发布时间】:2019-03-25 18:07:48
【问题描述】:

我正在努力理解,我是初学者。

我想用二进制浮点数进行算术运算。

我使用http://www.binaryconvert.com/result_float.html 进行转换

只有他还给我:

1069547520.000000
1069547520.000000
2139095040.000000

这是什么?

我希望这样:

00111111110000000000000000000000
00111111110000000000000000000000
01000000010000000000000000000000

printf() 中的%f 也会出错吗?

    #include <stdio.h>

    int main()
    {
        float a = 0b00111111110000000000000000000000; /* 1.5 */
        float b = 0b00111111110000000000000000000000; /* 1.5 */
        float c;

        c = a + b; /* 3.0 !? */

        printf("%f\n", a);
        printf("%f\n", b);
        printf("%f\n", c);

        return 0;
    }

【问题讨论】:

  • “我想用二进制浮点数进行算术运算。”所有标量类型的所有算术运算都以二进制形式完成。你*真正*想要什么?
  • 我知道返回给我但我不理解的价值

标签: c binary ieee-754


【解决方案1】:

二进制常量0b00111111110000000000000000000000 是一个extension of GCC,它的类型为int,其值为1069547520。这将转换为相同值的浮点数,即最接近 1069547520 的浮点数。

在 C 中没有办法在二进制中使用浮点常量;但十六进制是可能的。如果有,那么 1.5 将用二进制表示,就像

0b1.1f 

即它的二进制数值是1.1。

C17 (C99, C11) 确实支持十六进制浮点常量;你可以使用

0x1.8p0f

为1.5f; p0 表示指数。

如果你真的想摆弄 IEEE 754 二进制格式,你需要使用联合或memcpy。例如

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(void) {
    float a;
    uint32_t a_v = 0b00111111110000000000000000000000;

    memcpy(&a, &a_v, sizeof(float));
    printf("%f\n", a);
    // prints 1.500000 on linux x86-64
}

【讨论】:

  • 感谢您的回答,我必须用几个巨大的 csv 文件进行数千次计算,所以我想如果我使用二进制会更快,因为它可以避免转换,也就是说,我如何可以按照您提出的方式进行 aritimeticas 操作
  • @FabioFontes 好吧,在那种情况下,不,这不会更快。编译器会自动将 1.5f 转换为二进制表示。
  • 建议添加标准的十六进制选项,我认为应该是0x1.8p0。
  • @chux 谢谢,补充。虽然我怀疑这会帮助操作
  • Note C99 和 C11 支持hexadecimal floating constant。
【解决方案2】:

您的二进制文字是 integer 文字。然后你打印浮点值 as 浮点值,而不是使用二进制表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2011-03-07
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2011-02-24
    • 2014-09-04
    相关资源
    最近更新 更多