【问题标题】:Normalizing Binary Floating Point Values规范化二进制浮点值
【发布时间】:2013-10-17 03:01:57
【问题描述】:

我对如何在 C 中规范化数字有点困惑。我知道如果你有类似浮点二进制值 1101.101 的东西,通过将小数点移动 3 位到左边。但是,我不确定如何在代码中执行此操作。

所以如果我有 10010000 exp 0,我想得到 01001000 exp 1,则分数字段为“001”,最终结果为 010001。

如果我有一个 8 位数字并且前 2 位是 00,我想移动它直到找到 1,或者如果我有一个前导位 01,那么它已经被规范化了。同样,对于 11 的前 2 位,我将其移至左侧。

因此,如果我的数字是 32 位,符号为 1,指数为 8,尾数为 23,我会这样做:

if ( (result >> 24) == "11") ) // although here I know I'm comparing an int with a string
   {
   //code to set result = to the new number
   }
if ( (result >> 24) == "01" ) )
   {
      return result; 
   }

然后还有其他 2 个前导位数(00、10)的 if 语句?我不确定我的逻辑/代码是否正确。

谢谢。

【问题讨论】:

    标签: c binary bit-manipulation


    【解决方案1】:

    不,这是不正确的。

    浮点数以IEEE 754 Floating point format 表示,您不能只移动数字以对其进行规范化。

    如果你想用这种格式表示数字:

    (+/-)1.M x 2<sup>E</sup>

    然后你必须先分别提取符号位、尾数M和指数E

    然后进行二元运算(移位、AND、OR 等)以您想要的方式表示它。

    【讨论】:

    • 我已经将符号、尾数和指数分开了。那么从技术上讲,我现在可以进行二进制操作了吗?
    【解决方案2】:


    就像你说的,你需要提取符号、尾数指数。上图取自Wikipedia,显示了它是如何针对最常见的单精度浮点格式 IEEE 754 进行布局的。

    要提取每个部分,我们需要通过以下详细说明的三个步骤来执行此操作。我没有 C 代码,但我会展示您需要采取的步骤。提取这 3 个部分后,只需将它们放在上图所示的位位置即可。

    1。签到

    如果是无符号数,则始终为 0。

    如果已签名,则为 MSB。

    2。指数

    如果数字是有符号且为负数,则需要翻转所有位并加 1 以将其变为正数。如果没有,您可以保持原样。

    要提取指数,我们必须知道二进制点的位置。让二进制点的位置为 b (在您的示例中为 3)。

    让 MSB 的第一位为 1 p(在您的示例中为 6)。

    设指数为e

    e = 127 - (b - p)

    3。尾数

    这将等于从位置 p-1 到第 0 位的位。

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 2021-06-13
      • 2010-10-03
      • 2012-03-10
      • 2013-02-14
      • 2022-12-10
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多