【问题标题】:conversion from binary to base 10 using floating point conversion使用浮点转换从二进制转换为基数 10
【发布时间】:2012-08-13 17:34:56
【问题描述】:

这是我第一次发帖。

所以这是我的问题,我看不懂下面的例子。

二进制表示: 01000000011000000000000000000000

=+(1.11)base 2x 2^(128-127)

=+(1.11)base 2 x2^1

=+(11.1) base 2

=+(1x21+1x20+1x2-1)=(3.5) base 10

问题: 128-127 是从哪里来的?
为什么是1.11?

【问题讨论】:

    标签: floating-point binary computer-science digital-logic


    【解决方案1】:

    single precision floating point format 中,指数偏差为常数 127。您给出的特定位模式将浮点数编码为 128 (1000000) 作为指数:

    0 10000000 11000000000000000000000
    s exponent fraction
    

    先看符号位,是0,所以是正数。

    然后从指数中减去指数偏差,这就是 128 - 127 的来源。这给出了1

    然后我们开始将分数中的位相加(11000000000000000000000):

    1 + 0.5 + 0.25 + 0 + 0 + 0....
    

    给出 1.75

    现在我们有 1(sign) * 2^1(exponent) * 1.75(fraction) = 2 * 1.75 = 3.5

    另一个例子:

    00111110101010101010101010101011
    

    分解:

    0 01111101 01010101010101010101011
    s exponent fraction
    

    符号为0,所以又是正数。

    125 (01111101) 指数,从中减去指数偏差:125 - 127 = -2

    解码分数01010101010101010101011

    1 + 0 + 0.25 + 0 + 0.0625 + 0 + 0.015625 + 0 + 0.00390625 + 0 + 0.0009765625 + 0 + 0.000244140625 + 0 + 0.00006103515625 + 0 + 0.0000152587890625 + 0 + 0.000003814697265625 + 0 + 9.5367431640625e-7 + 0 + 2.384185791015625e-7 + 1.1920928955078125e-7
    

    这给了1.3333333730697632左右。

    现在把它们加在一起:

    1(sign) * 2^-2(exponent) * 1.3333333730697632(fraction) = 0.25 * 1.3333333730697632 = 0.3333333432674408 =~ 0.3333333
    

    【讨论】:

    【解决方案2】:

    首先,您要做的第一件事就是分离字段(给定 IEEE 754 32 位浮点编码):

    符号位:0

    指数位:10000000

    尾数位:11000000000000000000000

    (128 - 127) 是通过减去指数偏差来计算指数。

    从浮点数转换为十进制数时,减去指数偏差。当以另一种方式转换时,您添加它。指数偏差计算如下:

    2^(k−1) − 1 其中 k 是指数字段中的位数。

    2^(8 - 1) - 1 = 127
    

    尾数是 1.11,以 2 为底(二进制)。尾数由一个分数组成,并且有一个隐含的前导 1。因此,在尾数位中有 11000...,你有一个隐含的前导一个给你 1.11

    如果尾数位是 1011,那么小数的值就是 1.011

    【讨论】:

      【解决方案3】:

      本教程应该能让你更好地理解浮点数:

      http://www.tfinley.net/notes/cps104/floating.html

      二进制表示分为 3 个部分:1 个符号位、8 个指数位和 23 个尾数位。

         0|10000000|11000000000000000000000
      sign|exponent|       mantissa
      

      符号位为零,表示它是一个正数。根据定义,指数 (128) 比实际值大 127,解析为 1(即 128 - 127)。尾数是 1.11(前导 1 是隐含的,同样根据定义)。因此,我们有

        01000000011000000000000000000000
      = +(1.11)base 2 x 2^(128-127)
      = (2^0 + 2^-1 + 2^-2) x 2^1
      = 2^1 + 2^0 + 2^-1
      = 2 + 1 + 0.5
      = 3.5
      

      【讨论】:

        【解决方案4】:

        我认为指数中有偏差 (+127) 的原因是:

        如果将浮点数解释为 32 位整数,则不会更改顺序。
        那是

        float a,b;
        assert((a < b) == ((int)(a) < (int)(b)));
        
        • 因此,符号位先出现,然后是指数,然后是尾数
        • 因此,最小的正浮点数的指数为零
        • 因此,0.0 被编码,所有位都设置为 0

        因此,您必须通过减去 127 来消除指数的偏差...

        编辑:不等式适用于常规浮点数,但不适用于 NaN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-10-17
          • 2017-06-24
          • 1970-01-01
          • 2014-11-24
          • 2015-10-11
          相关资源
          最近更新 更多