标准化二进制浮点值

问题描述 投票:0回答:2

如果有类似浮点二进制值 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
语句?

我的逻辑/代码有什么问题?

c binary bit-manipulation
2个回答
1
投票

不,这是不正确的。

浮点数以 IEEE 754 浮点格式表示,您不能仅通过移动数字来对其进行标准化。

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

(+/-)1.M x 2E

然后你必须先分别提取符号位,尾数

M
和指数
E

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


1
投票

IEEE 754 single precision format


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

© www.soinside.com 2019 - 2024. All rights reserved.