【问题标题】:Algorithm for converting fraction to binary将分数转换为二进制的算法
【发布时间】:2021-02-04 17:56:53
【问题描述】:

我被教导将小数转换为二进制的方法是不断地将数字乘以 2,将整个部分添加到位串中,然后再乘以新的小数。这在某些情况下似乎有效,但在其他情况下,例如 0.32,它会导致无限循环。

0.32 * 2 = 0 + .64
0.64 * 2 = 1 + .28
0.28 * 2 = 0 + .56
0.56 * 2 = 1 + .12
0.12 * 2 = 0 + .24
0.24 * 2 = 0 + .48
0.48 * 2 = 0 + .96
0.96 * 2 = 1 + .92
0.92 * 2 = 1 + .84
0.84 * 2 = 1 + .68
0.68 * 2 = 1 + .36
0.36 * 2 = 0 + .72
0.72 * 2 = 1 + .44
0.44 * 2 = 0 + .88
0.88 * 2 = 1 + .76
0.76 * 2 = 1 + .52
0.52 * 2 = 1 + .04
0.04 * 2 = 0 + .08
0.08 * 2 = 0 + .16
0.16 * 2 = 0 + .32 // Loop

在这种情况下我该怎么办?

【问题讨论】:

    标签: algorithm binary


    【解决方案1】:

    除了K/2^M(如 0.125、0.75 等)以外的所有分数都不能用有限数量的二进制数字表示,因此它们具有无限重复结构,如 0.11011011011011...所以大多数分数都没有精确表示。

    除了2^p*5^q之外,十进制和分母的情况相同——例如,1/3 = 0.333333333……等等

    【讨论】:

    • 这是有道理的。所以要遵循 IEEE 754 标准,是否应该在 23 次迭代后停止,因为这是单精度浮点数的尾数限制?
    • 是的。另请注意,IEEE 浮点尾数始终位于 0.5..1 范围内,隐含一位,因此您需要用指数 -1 表示 0.64(而不是用指数 0 表示 0.32)
    • @richbai90 要正确舍入,需要 1) +1 次迭代 (24) 来找到舍入位和 2) 查看是否存在任何余数以打破中途情况。
    • "大多数浮点数没有精确表示。" --> 所有有限的double, float 都是精确的,它们使用二进制编码。类似 FP 的表示法(代码常量)中的十进制数不能完全转换。
    【解决方案2】:

    我不熟悉您的算法,但教授长除法的算法与您提出的相似。通常,我们通过询问某个数的 10 的多少次方进入另一个数来教长除法。这给了你十进制的答案。您可以通过询问某个数字的 2 的多少次方进入另一个数字来对二进制做同样的事情。如果我们想将 0.32 转换为二进制,我们必须问每个 2 的幂有多少。幂是 0、-1、-2 等。

    算法:

    1. Start with n = 0
    2. How many how many times does 2^n go into the number (should be either 0 or 1 times)? Write that down.
    3. If there is a remainder, decrement n (ie, n = n - 1).
    4. Go to step 2 until no remainder remains or the pattern repeats.
    
    Put a decimal after the first digit.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 2020-12-15
      • 2016-03-28
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多