如果有类似浮点二进制值 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
语句?
我的逻辑/代码有什么问题?
不,这是不正确的。
浮点数以 IEEE 754 浮点格式表示,您不能仅通过移动数字来对其进行标准化。
如果你想用这种格式表示数字:
(+/-)1.M x 2E
然后你必须先分别提取符号位,尾数
M
和指数E
。
然后进行二元运算(移位、AND、OR 等)以您想要的方式表示它。
就像你说的,你需要提取符号,尾数和指数。上图取自 Wikipedia,显示了最常见的单精度浮点格式 IEEE 754 的布局方式。
要提取每个部分,我们需要分以下三个步骤进行。我没有 C 代码,但我会展示您需要采取的步骤。提取出 3 个部分后,只需将它们放置在上图所示的位位置即可。
如果是无符号数,则始终为 0。
如果已签名,则为 MSB。
如果数字有符号且为负数,则需要翻转所有位并加 1 将其变为正数。如果没有,您可以保持原样。
要提取指数,我们必须知道二进制小数点在哪里。令二进制小数点的位置为 b (在您的示例中为 3)。
令 MSB 的第一位 1 为 p(在您的示例中为 6)。
令指数为 e:
e = 127 - (b - p)
这将等于从位置 p-1 到位 0 的位。