1

我对如何在 C 中规范化数字有点困惑。我知道如果你有类似浮点二进制值 1101.101 的东西,通过将小数点向左移动 3 个位置,它被规范化为 1.101101 x 2^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 语句?我不确定我的逻辑/代码是否正确。

谢谢。

4

2 回答 2

1

不,这是不正确的。

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

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

(+/-)1.M x 2E

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

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

于 2013-10-17T03:45:44.180 回答
1

IEEE 754 单精度格式


就像你说的,你需要提取符号、尾数指数。上图取自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 的位。

于 2013-10-17T14:45:34.277 回答