我对如何标准化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)?我不确定我的逻辑/代码是否正确。
感谢。
答案 0 :(得分:1)
不,这不正确。
浮点数用IEEE 754 Floating point format表示,你不能只是移动数字来标准化它。
如果您想以这种格式表示数字:
(+/-)1.M x 2E
然后,您必须先分别提取符号位,尾数M
和指数E
。
然后进行二元操作(移位,AND,OR等)以你想要的方式表示它。
答案 1 :(得分:0)
就像你说的那样,你需要提取符号,尾数和 exponent 。上图摘自Wikipedia,显示了最常见的单精度浮点格式IEEE 754的布局。
要通过以下三个步骤提取我们需要完成的每个部分。我没有C代码,但我会展示你需要采取的步骤。提取3个部分后,只需将它们放在上图所示的位位置即可。
如果是无符号数,则始终为0.
如果签名则是MSB。
如果数字是有符号且为负数,则需要翻转所有位并加1以使其为正数。如果没有,你可以保持原样。
要提取指数,我们必须知道二进制点的位置。设二进制点的位置为 b (在您的示例中为3)。
让MSB中的第一位是 p (在你的例子中是6)。
让指数为 e :
e = 127 - (b - p)
这将等于从 p-1 位置到位0的位。