双精度和小数点的表示

时间:2011-06-06 08:35:49

标签: c++ double

根据我所知的双(IEEE标准),有一位用于signus,54位用于尾数,一个基数和一些位用于指数

获得双倍的公式是:(−1)^s × c × b^q

也许我犯了一些错误,但这个想法就在这里。

我只是想知道如何知道在这个公式中放置小数点的位置。 如果我拿号码,我会得到例如:

m = 3
q = 4
s = 2
b = 2
(-1)^2 * 4 * 2^3 = 32

但我不知道在哪里放点基数..

这里有什么问题?

编辑:

也许q总是负面的?

2 个答案:

答案 0 :(得分:2)

我想看看维基百科会有所帮助。

事情是,有一个“隐藏的”'1'。在IEEE公式中。

必须对每个IEEE 754号码进行规范化,这意味着编码的数字采用以下格式:

(-1)^(sign) * '1.' (mantissa) * 2^(exponent)

因此,您编码的是1.32,而不是32。

答案 1 :(得分:1)

32 = 1 * 2 ^ 5,因此尾数= 1,指数= 5,符号= 0。在编码指数时我们需要向指数添加1023,所以下面我们有1023 + 5 = 1028。我们还需要在编码尾数时删除数字1,这样1.(无论如何)变成(无论如何)

32位为64位双精度的十六进制表示为4040000000000000,或二进制:

0100 0000 0100 0000 0000 ... and zeros all the way down
               ^======== start of mantissa (coded 0, interpreted 1.0)
 ^===========^---------- exponent (coded 1028, interpreted 5)
^----------------------- sign (0)

要验证结果,请访问此page,在第一个字段中输入32,然后单击“圆角”或“未圆角”按钮(无关紧要)。