【问题标题】:Convert non terminating binary number to decimal将非终止二进制数转换为十进制
【发布时间】:2012-03-04 12:37:18
【问题描述】:

我不知道如何将非终止二进制数(分数)转换为十进制。谁能指导我如何做一个例子?

【问题讨论】:

    标签: binary universal-binary base-conversion binary-operators


    【解决方案1】:

    如果您有一个以 2 为底的“重复小数”并且您知道 重复其中的一部分,可以将其转换为精确的 p/q 表示法中的有理数(其中 pq 是整数)。

    然后,您可以使用除法将该数字转换为普通十进制表示法,以达到您想要的任意位数的精度。 (在某些情况下,您甚至可以写出精确的十进制值。)

    第一步是将二进制数分解为 重复和不重复的部分。

    其实我们想要三样东西:

    • 非重复部分,
    • 第一次出现重复的数字块,并且
    • 重复数字块的长度。

    假设例如数字是:

    1.0001100110011... (binary)
    

    最后一个 0011 无限重复。

    我们可以这样分解:

    • 非重复部分为 1.0(二进制)
    • 重复块的第一次出现是 0.00011(二进制),并且
    • 重复块 (0011) 的长度为四位二进制数字。

    二进制数的重复部分是几何级数 并且可以使用the standard formula for such a series进行评估:

    a + a*r + a*r^2 + a*r^3 + ... = a/(1 - r).

    将此公式应用于重复数字:

    • a 的值只是重复块第一次出现的值
    • 如果重复部分有n个二进制数字,公式中的比例r为1/2^n和1-r = (2^n - 1)/(2^n)。

    对于示例 1.00011011011...(二进制),

    • 从重复部分我们有 a = 0.00011 (binary) = 3/32
    • n = 4,所以 1 - r = (2^4 - 1)/(2^4) = 15/16。

    因此

    a/(1 - r) = (3/32) / (15/16) = 3/30 = 1/10,

    我们可以写成 0.1(十进制)。

    不重复的部分,当然是1(十进制),所以

    1.00011011011...(二进制)= 1 + 0.1(十进制)= 1.1(十进制)。

    在此示例中,十进制表示是终止且精确的。

    有许多重复的二进制分数,其中没有精确的终止十进制表示,例如,

    0.01010101...(二进制)= 1/3 = 0.3333...(十进制)。

    在这种情况下,您必须决定在某些小数位数后四舍五入,或者找出并描述小数位数的重复模式。

    【解决方案2】:

    如果二进制数是未终止的整数,它将是无限的(正或负)。你怎么能用十进制表示无限数?我认为是

    如果二进制数是浮点数,那么恭喜。在浮点数的许多标准(例如,IEEE 754)中,尾数由二进制模式表示,其中最高位的值为 1/2,第二位的值为 1/4,依此类推。所以你可以通过从左到右逐位累加将其转换为十进制。

    例如,你有一个未终止的二进制模式说

    10111011101110111011.......

    要转换成十进制,只需将它们累积为

    1*1/2 + 0*1/4 + 1*1/8 + 1 *1/16 + 1*1/32 + 0*1/64 + 1*1/128 + 1强>*1/256 ........

    直到获得足够的精度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2012-06-26
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多