【问题标题】:Converting a number to IEEE 754将数字转换为 IEEE 754
【发布时间】:2019-10-23 10:44:19
【问题描述】:

谁能帮我解答这个问题:

“将十进制数 10/32 转换为 32 位 IEEE 754 浮点数和 用十六进制表达你的答案。 (提醒:32 位用作 如下:第 1 位:尾数的符号,第 2-9 位:超过 127 的 8 位指数,第 10-32 位:尾数大小为 23 位。)”

我知道如何将十进制数转换为 IEE 754。但我对如何回答这个问题感到困惑——它只给了我一个商?我不允许使用计算器,所以我不确定如何计算出来。我是否应该先将它们都转换为二进制并划分它们?

【问题讨论】:

  • 我从标题中删除了“方程式”,因​​为“10/32”不是方程式。等式有一个等号,并且是两个事物具有相同值的陈述。 “10/32”只是一个表达式或一个有理数。我留下了不正确的“十进制数”,因为它在引号内,所以大概它来自另一个来源。那个来源是错误的; “10/32”不是十进制数。它是一个使用两个十进制数字的表达式,由于有理数被定义为整数的比率,它可以被认为是一个有理数。

标签: math floating-point binary ieee-754 calculation


【解决方案1】:

10/32 = 5/16 = 5•2-4 = 1.25•2-2 = 1.012•2−2.

符号为+,指数为-2,有效数字为1.012

正号编码为 0。

指数 -2 被编码为 -2 + 127 = 125 = 011111012

Significand 1.012是1.010000000000000000000002,使用后23位编码,0100000000000000000000002

将这些放在一起,IEEE-754 编码为 0 01111101 01000000000000000000000。要转换为十六进制,首先组织成四位组:0011 1110 1010 0000 0000 0000 0000 0000。然后可以轻松读取十六进制:3EA >16.

【讨论】:

    【解决方案2】:

    我是这样看的:

    10/32 =        // input
    10/2^5 =       // convert division by power of 2 to bitshift
    1010b >> 5 =
    .01010b        // fractional result
    --^-------------------------------------------------------------
      |
    first nonzero bit is the exponent position and start of mantissa
    ----------------------------------------------------------------
    man = (1)010b           // first one is implicit
    exp = -2 + 127 = 125    // position from decimal point + bias
    sign = 0                // non negative
    ----------------------------------------------------------------
    0 01111101 01000000000000000000000 b
    ^    ^                ^
    |    |            mantissa + zero padding
    |   exp
    sign
    ----------------------------------------------------------------
    0011 1110 1010 0000 0000 0000 0000 0000 b
       3    E    A    0    0    0    0    0 h
    ----------------------------------------------------------------
    3EA00000h
    

    是的,Eric Postpischil 的答案是相同的方法(+1 顺便说一句),但我不喜欢这种格式,因为乍一看还不清楚如果没有正确阅读文本该怎么办。

    【讨论】:

      【解决方案3】:

      在没有计算器的情况下进行 10/322 的转换是一种纯粹的虐待狂。

      有一个通用的方法可以不用工具,但是可能很乏味。

      N is the number to code. We assume n<1
      exp=0
      mantissa=0 
      repeat 
        n *= 2
        exp ++
        if n>1
          n = n-1
          mantissa = mantissa <<1 | 1
        else
          mantissa = mantissa <<1
      until mantissa is a 1 followed by 23 bits
      

      那么你只需要将尾数和 (23-exp) 编码为 IEEE 格式。

      请注意,这种计算经常会导致循环。只要找到相同的n,就知道序列会重复。

      作为一个例子,假设我们必须编码 3/14

      3/14  -> 6/14  e=1 m=0  
      6/14  -> 12/14 e=2 m=00
      12/14 -> 24/14-14/14=10/14 e=3 m=001
      10->14 -> 20/14-14/14=6/14 e=4 m=0011
      6/14   -> 12/14 e=5 m=00110
      

      太好了,我们发现了一个循环!
      6/14->12/14->10/14->6/14.
      所以尾数将根据需要迭代110 110110110...

      如果我们用 24 位填充尾数,我们需要 26 次迭代,并且指数是 23-26=-3(另一种获得它的方法是在迭代 3 时 n 第一次变为 >1,指数是 - 3 为 1≤3/14*2^3

      我们可以使用指数=127-3=124 和尾数=1.1011011011011 进行 IEEE754 编码......

      【讨论】:

      • 嗨,我很欣赏写得很好的答案。但是,这是笔试,只值 6 分,所以我认为不需要这样的工作。我实际上在原始问题中打错了字,它不是要求 10/322 的答案,它实际上是要求 10/32(32 是底数 2),这是问题的样子(将使更容易理解):gyazo.com/fde9db7ec588fe088e8a73014e8f74d4 - 我想我可以将实际数字划分为二进制? IE。将二进制的 10 除以 32 然后从那里开始?有什么建议吗?谢谢。
      • 10/32,我明白了。我提出的方法是通用的,可以处理任何(讨厌的)分数,如 10/322。但如果分母是 2 的幂,则将分子编码为二进制,并按照 Eric Postpischil 提出的方法移动点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2014-10-18
      • 1970-01-01
      • 2014-06-18
      • 2013-10-04
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多