规范化二进制浮点值

时间:2013-10-17 03:01:58

标签: c binary bit-manipulation

我对如何标准化C中的数字感到有些困惑。我知道如果你有类似浮点二进制值1101.101的东西,它通过将小数点3位移到标准化为1.101101 x 2 ^ 3左边。但是,我不知道如何在代码中执行此操作。

因此,如果我有10010000 exp 0并且我想获得01001000 exp 1,则分数字段为“001”,最终结果为010001.

如果我有一个8位数字且前2位是00,我想移动它直到找到1,或者如果我有一个前导位01那么它已经被标准化了。类似于前导的2位11,我将它移到左边。

所以,如果我的数字是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; 
   }

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

感谢。

2 个答案:

答案 0 :(得分:1)

不,这不正确。

浮点数用IEEE 754 Floating point format表示,你不能只是移动数字来标准化它。

如果您想以这种格式表示数字:

(+/-)1.M x 2E

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

然后进行二元操作(移位,AND,OR等)以你想要的方式表示它。

答案 1 :(得分:0)

IEEE 754 single precision format


就像你说的那样,你需要提取符号,尾数 exponent 。上图摘自Wikipedia,显示了最常见的单精度浮点格式IEEE 754的布局。

要通过以下三个步骤提取我们需要完成的每个部分。我没有C代码,但我会展示你需要采取的步骤。提取3个部分后,只需将它们放在上图所示的位位置即可。

1。注册

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

如果签名则是MSB。

2。指数

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

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

让MSB中的第一位是 p (在你的例子中是6)。

让指数为 e

  

e = 127 - (b - p)

3。尾数

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