【问题标题】:In binary notation, what is the meaning of the digits after the radix point "."?在二进制表示法中,小数点“.”之后的数字是什么意思?
【发布时间】:2013-03-07 22:13:27
【问题描述】:

我有一个关于如何将基数为 10 的数字转换为 IEEE 754 浮点表示的示例

Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0
Normalized form N = 1.0110101 * 2^5
Exponent esp = 5  E = 5 + 127 = 132 (base 10) = 10000100 (base 2)
IEEE 754: 0 10000100 01101010000000000000000

这对我来说很有意义,除了一段:

45.25 (base 10) = 101101.01 (base 2)

45 在二进制中是 101101,这没关系.. 但是他们是如何获得 0.25 作为 .01 的?

【问题讨论】:

    标签: c++ c floating-point ieee-754


    【解决方案1】:

    简单的位值。在 base 10 中,你有这些地方:

    ... 103 102 101 100. 10-1 10-2 10-3 ...

    ... 千、百、十、个。十分之一,百分之一,千分之一......

    同样,在二进制(以 2 为基数)中,您有:

    ... 23 22 21 20. 2-1 2-2 2-3 ...

    ... 八,四,二,一。一半,四分之一,八分之一......

    因此,二进制中. 之后的第二位是 2-2 的单位,您熟知的单位是 1/4(或 0.25)。

    【讨论】:

    • +1,虽然我发现将二进制位置称为“八、四...”有点幽默,因为每个位置的值永远不会超过一个。
    • @David,这是一个很好的观点。我一直在纠结该怎么做,但我选择了复数来匹配常见的小数用法,希望能让解释更容易理解。
    【解决方案2】:

    您可以通过反复乘以新基数(在本例中新基数为 2)将小数点后的部分转换为另一个基数,如下所示:

    0.25 * 2 = 0.5
    

    -> 二进制第一位为0(取整数部分,即小数点前的部分)。

    继续乘以小数点后的部分:

    0.5 * 2 = 1.0
    

    ->第二个二进制数字是1(再次取整数部分)。

    这也是我们停止的地方,因为小数点后的部分现在为零,所以没有什么可以乘的了。

    因此小数部分的最终二进制表示为:0.012

    编辑:

    可能还值得注意的是,即使从以 10 为底的有限小数部分开始,二进制表示通常也是无限的。示例:将 0.210 转换为二进制:

    0.2 * 2 = 0.4   ->   0
    0.4 * 2 = 0.8   ->   0
    0.8 * 2 = 1.6   ->   1
    0.6 * 2 = 1.2   ->   1
    0.2 * 2 = ...
    

    所以我们最终得到:0.001100110011...2

    使用这种方法,您很容易看出二进制表示是否最终是无限的。

    【讨论】:

      【解决方案3】:

      考虑到其他基数的“小数”(小数位)与整数的工作方式完全相同。

      base 10
      scinot 10e2  10e1  10e0 10e-1 10e-2 10e-3
      weight 100.0 10.0   1.0  0.1   0.01  0.001
      value  0     4      5     .2      5      0
      
      base 2
      scinot 2e6 2e5 2e4 2e3 2e2 2e1 2e0 2e-1 2e-2 2e-3
      weight 64  32  16   8   4   2   1   .5   .25 .125
      value   0   1   0   1   1   0   1   .0    1    0   
      

      如果我们从 45.25 开始,它大于/等于 32,所以我们添加一个二进制 1,然后减去 32。
      我们剩下 13.25,它小于 16,所以我们添加一个二进制 0。
      我们剩下 13.25,它大于/等于 8,所以我们添加一个二进制 1,然后减去 8。
      我们剩下 05.25,它大于/等于 4,所以我们添加一个二进制 1,然后减去 4。
      我们剩下 01.25,它小于 2,所以我们添加一个二进制 0。
      我们剩下 01.25,它大于/等于 1,所以我们添加一个二进制 1,然后减去 1。
      对于整数,我们将剩下零,所以我们停止。但是:
      我们剩下 00.25,它小于 0.5,所以我们添加一个二进制 0。
      我们剩下 00.25,它大于/等于 0.25,所以我们添加一个二进制 1,然后减去 0.25。
      现在我们有零,所以我们停止(或者不停止,你可以如果您愿意,请继续并永远计算零)

      请注意,并非所有十进制的“简单”数字都始终达到零停止点。 0.1(十进制)转换为基数 2,无限重复:0.0001100110011001100110011...但是,二进制中的所有“简单”数字总是会很好地转换为基数 10。

      您也可以对分数 (2.5)、无理数 (pi) 甚至虚数 (2i) 基数执行相同的过程,但基数不能介于 -1 和 1 之间。

      【讨论】:

      • 但是我们不能比较虚数,对吗?
      • @Rotsor:我想我们可以,我只是不知道怎么做。 Knuth 想出了如何处理非理性基础:en.wikipedia.org/wiki/Quater-imaginary_base
      • @Rotsor & Mooing Duck:Rotsor 是正确的,因为数学不等式(、=)没有为复数定义。解决该问题的一种方法是使用 Knuth 的四虚数基数,因为复数可以用该基数写成单个项(例如 7 + 4i (base 10) = 10323 (base 2i))。然而,十进制的比较并不总是产生与四虚数相同的结果。例如:0 > -4(以 10 为底),而 0
      • @nijoakim:很高兴知道数学不等式没有定义,并且“显而易见”的方式与有理数的比较不匹配。但是,我仍然相信可能存在一种有意义的方法。
      • @MooingDuck:是的,我同意这很有可能。自从您发布此内容后,我实际上一直在尝试解决这个问题,但结果非常困难。
      【解决方案4】:

      2.00010 = 2+1 = 10.0002
      1.00010 = 2+0 = 01.0002
      0.50010 = 2-1 = 00.1002
      0.25010 = 2-2 = 00.0102
      0.12510 = 2-3 = 00.0012

      【讨论】:

        【解决方案5】:

        以 2 为底的分数是 .1 = 1/2, .01 = 1/4。 ...

        【讨论】:

          【解决方案6】:

          这样想

          (点)2^-1 2^-2 2^-3 等

          所以

          。 0/2 + 1/4 + 0/8 + 0/16 等

          http://floating-point-gui.de/formats/binary/

          【讨论】:

            【解决方案7】:

            您可以将 0.25 视为 1/4。

            除以 2 in (base 2) 将小数点左移一位,同样的方法除以 10 in (base 10) 将小数点左移一位。一般除以 M in (base M) 小数点左移一位。

            所以

            base 10                  base 2
            --------------------------------------
            1                      =>      1
            1/2 = 0.5              =>    0.1
            0.5/2 = 1/4 = 0.25     =>   0.01 
            0.25/2 = 1/8 = 0.125   =>  0.001
            .
            .
            .
            

            等等

            【讨论】:

              猜你喜欢
              • 2023-04-03
              • 2022-09-23
              • 1970-01-01
              • 2017-04-04
              • 1970-01-01
              • 2013-10-02
              • 2020-01-24
              • 2011-03-16
              • 2012-01-01
              相关资源
              最近更新 更多