【问题标题】:How to convert float number to Binary?如何将浮点数转换为二进制?
【发布时间】:2011-04-26 15:39:08
【问题描述】:

谁能告诉我如何将这个浮点数:12.25 转换为二进制? 我知道如何转换“12”而不是 0.25

非常感谢任何帮助。 谢谢

【问题讨论】:

  • 手动 :) 之后我可以通过编程方式完成。
  • 是的 :) 我需要知道如何将 0.25 计算为二进制
  • 你对“12”的算法是什么?我认为相同的算法对于“.25”的工作原理相同,可能只是将“2”更改为“1/2”。
  • 对于 12,我只是继续将其除以 2 并得到余数。

标签: binary floating-point


【解决方案1】:

考虑下面的例子

将 2.625 转换为二进制。

我们将分别考虑整数和小数部分。

The integral part is easy, 2 = 10. 

对于小数部分:

0.625   × 2 =   1.25    1   Generate 1 and continue with the rest.
0.25    × 2 =   0.5     0   Generate 0 and continue.
0.5     × 2 =   1.0     1   Generate 1 and nothing remains.

所以 0.625 = 0.101,而 2.625 = 10.101。

查看this链接了解更多信息。

【讨论】:

    【解决方案2】:

    继续将小数点后的数字乘以 2,直到变为 1.0:

    0.25*2 = 0.50
    0.50*2 = 1.00
    

    结果是相反的顺序是 0.01

    【讨论】:

    • @Slim Black:当心:这对于像 0.25 这样的数字非常有效,它在二进制中有精确的表示,但对于像 0.1 这样的数字却不是这样:0.1*2 = 0.2, 0.2*2 = 0.4, 0.4*2 = 0.8, 0.8*2 = 1.6, 0.6*2 = 1.2, 0.2*2 = 0.4, ... 永远重复,结果是 0.0(0011) (括号中的部分重复)。
    • @Slim Black:请注意,要以编程方式正确实现这一点,您需要十进制算术 - 请参阅我的文章 exploringbinary.com/base-conversion-in-php-using-bcmath,特别是 dec2bin_f() 部分。)
    【解决方案3】:

    (d 表示十进制,b 表示二进制)

    1. 12.25d 是你的浮点数。
    2. 您将 12d 写入二进制并将其从浮点数中删除。只有 余数 (.25d) 将被留下。
    3. 你写点。
    4. 虽然余数 (0.25d) 不为零(和/或您需要更多位数),但将其乘以 2 (-> 0.50d),删除并写入点左边的数字 (0),然后继续新的余数 (.50d)。

    【讨论】:

    • 如果我的浮点数是 5.1 怎么办?做你的步骤,我陷入了无限循环,请帮助!
    • @nautilusvn:因为没有 2 的幂也是 10 的倍数,所以该数字具有无限的数字序列。你可能想在某个地方中止你的计算。
    • @nautilusvn 嗯,是的,“虽然不为零”是一个愚蠢的说法.. 改变它。
    【解决方案4】:

    float 值以 IEEE 754 格式存储,因此我们不能像整数、char 那样直接将其转换为二进制。

    但我们可以通过指针将浮点数转换为二进制。

    #include <stdio.h>
    
    int main()
    {
        float a = 7.5;
        int i;
        int * p;
    
        p = &a;
        for (i = sizeof(int) * 8 - 1; i >= 0; i--)
        {   
            printf("%d", (*p) >> i & 1); 
        }   
    
        return 0;
    }
    

    输出

    0 10000001 11100000000000000000000
    

    为澄清添加了空格,它们不包含在程序中。

    【讨论】:

    • 我知道是旧的,但是这里的 i 有什么价值呢?
    • 我很好,我认为您需要将其替换为您的答案:))
    【解决方案5】:
    x = float(raw_input("enter number between 0 and 1: "))
    
    p = 0
    while ((2**p)*x) %1 != 0:
        p += 1
        # print p
    
        num = int (x * (2 ** p))
        # print num
    
        result = ''
        if num == 0:
            result = '0'
        while num > 0:
            result = str(num%2) + result
            num = num / 2
    
        for i in range (p - len(result)):
            result = '0' + result
        result = result[0:-p] + '.' + result[-p:]
    
    print result #this will print result for the decimal portion
    

    【讨论】:

    • 也许您还想添加对从何处获取的引用。这段 python 代码对我来说很熟悉。
    【解决方案6】:
    void transfer(double x) {
    unsigned long long* p = (unsigned long long*)&x;
    for (int i = sizeof(unsigned long long) * 8 - 1; i >= 0; i--) {cout<< ((*p) >>i & 1);}}
    

    【讨论】:

    • 嗨。欢迎来到SO。谢谢你的代码,但你能解释一下它是如何解决这个问题的吗?
    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2014-11-24
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多