如何将浮点数转换为二进制?

42

请问有人可以告诉我如何将这个浮点数 12.25 转换成二进制吗? 我知道如何将 “12” 转换,但是不知道如何转换 0.25。

非常感谢任何帮助。 谢谢


4
手动操作 :) 在此之后我可以通过程序自动完成。 - Slim Black
是的 :) 我需要知道如何将0.25转换为二进制。 - Slim Black
你对“12”有什么算法?我认为同样的算法对于“.25”同样适用,只需要将“2”改为“1/2”即可。 - Ken
对于数字12,我只需不断将其除以2并获取余数。 - Slim Black
看这个:http://kipirvine.com/asm/workbook/floating_tut.htm - PSS
下面删除的帖子链接到一个关于浮点数在磁盘上存储方式的直觉非常好的博客,应该会很有帮助。https://blog.penjee.com/binary-numbers-floating-point-conversion - Eric Leschinski
6个回答

35

考虑以下例子

将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。

查看此链接获取更多信息。


30

将小数点后的数字乘以2,直到它变成1.0:

0.25*2 = 0.50
0.50*2 = 1.00

而结果是倒序的,为 .01。


13
@Slim Black: 注意:这种方法对于像0.25这样在二进制中有精确表示的数字可以正常运作,但对于像0.1这样在二进制中没有精确表示的数字就不行了:0.12 = 0.2, 0.22 = 0.4, 0.42 = 0.8, 0.82 = 1.6, 0.62 = 1.2, 0.22 = 0.4, ... 这个过程会一直重复下去,结果是0.0(0011)(括号内的部分是无限循环的)。 - Rick Regan
1
@Slim Black:请注意,为了在程序中正确实现此功能,您需要使用十进制算术--请参阅我的文章http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/,特别是dec2bin_f()部分。 - Rick Regan

14

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

  1. 12.25d 是你的浮点数。
  2. 你将12d用二进制写出并从浮点数中移除。只剩下余数(.25d)。
  3. 你写下小数点。
  4. 当余数(0.25d)不为零(和/或你想要更多数字)时,将其乘以2(-> 0.50d),移除并写下小数点左边的数字(0),然后继续使用新余数(.50d)。

1
如果我的浮点数是5.1呢?按照你的步骤,我陷入了无限循环,请帮忙! - nautilusvn
2
@nautilusvn:因为没有2的幂也是10的倍数,所以那个数字有一个无限的数字序列。你可能想在某个地方中止计算。 - comonad
1
@nautilusvn 嗯,是的,“while not zero”是一个愚蠢的语句.. 我会更改它。 - comonad

6

浮点数的值以IEEE 754格式存储,因此我们不能像整数、字符转换成二进制那样直接将其转换。

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

#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

这里的空格是为了澄清,它们不是程序的一部分。


1
我知道这很老,但是这里的 i 的值是多少? - Michi
我很好,我认为你需要将其替换为你的答案:)) - Michi

1
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 代码看起来很熟悉。 - Kin Cheung

0
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。感谢您的代码,但是您能解释一下它是如何解决问题的吗? - Krzysztof Madej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接