浮点二进制到十进制?

时间:2013-06-26 23:05:31

标签: binary

我知道如果明确给出指数和尾数,如何将float二进制转换为十进制,但这些示例如何:

0.11 =? 0.101 =?

我知道值是75和625,但转换过程是如何实现的?

1 个答案:

答案 0 :(得分:0)

要将某些分数f(其中0 ≤ f < 1)转换为基础B中的数字序列,请执行以下算法:

mantissa = 0
exponent = 0

while f > 0 and exponent > minExponent:
    p = f * B
    i = floor(p)
    f = p - i

    mantissa = mantissa * B + i
    exponent -= 1

minExponent是一个限制输出大小的常量。 mantissaexponent的最终值是mantissa * B^exponent == f(原始f)(在exponent >= minExponent的约束下。

请注意,该算法并不关心计算机内部如何表示分数。它可以是二元或三元或sexagesimal;没关系。该算法将f转换为整数,当除以B的适当幂时,该整数等于f

另请注意,mantissa需要能够存储与-minExponent一样多的数字。这可能意味着您需要使用大整数库,具体取决于您的编程语言提供的内容。

这是一个完整的Python脚本,演示了算法:

from __future__ import division
from math import floor

def convert(f, B, minExponent):
    mantissa = 0
    exponent = 0

    while f > 0 and exponent > minExponent:
        p = f * B
        integer = floor(p)
        f = p - integer

        mantissa = mantissa * B + integer
        exponent -= 1

    print "result = %d * %d^%d" % (mantissa, B, exponent)

convert(3/4, 10, -40)
convert(5/8, 10, -40)
convert(1/3, 10, -40)

这是输出:

result = 75 * 10^-2
result = 625 * 10^-3
result = 3333333333333333031620069604124830728192 * 10^-40