为双数据类型分配的位数

时间:2015-05-14 11:50:53

标签: c types floating-point double

64中有多少位分配给整数部分,而小数部分分配给double。或者是否有任何规则来指定它?

2 个答案:

答案 0 :(得分:3)

注意:我知道我已经回复了评论。这和OP一样,对我自己有利;当我试图解释它时,我总是学到新东西。

浮点值(无论精度如何)表示如下:

    sign * significand * βexp 

其中 sign 为1或-1,β base exp 是一个整数指数, significand 是一个分数。在这种情况下,β2。例如,实际值3.0可以表示为1.102 * 210.112 * 22,甚至0.0112 * 23

请记住,二进制数是2的幂之和,功率从左侧开始递减。例如,1012相当于1 * 22 + 0 * 21 + 1 * 20,它为我们提供值5。您可以使用2的负幂来扩展小数点,因此101.112相当于

1 * 22 + 0 * 21 + 1 * 20 + 1 * 2-1 + 1 * 2-2

给出了十进制值5.75。浮点数是规范化的,这样在小数点之前有一个非零数字,所以我们没有将5.75写为101.112,而是#&# 39; d将其写为1.01112 * 22

这是如何以32位或64位二进制格式编码的?确切的格式取决于平台;大多数现代平台使用IEEE-754规范(其中还指定了浮点算法的算法,以及特殊值为无穷大和非数字(NaN)),但是一些较旧的平台可能使用它们自己的专有格式(例如VAX G和H扩展精度浮子)。我认为x86还有一个专有的80位格式用于中间计算。

总体布局如下所示:

seeeeeeee...ffffffff....

其中s表示符号位,e表示专用于指数的位,f表示专用于有效位或分数的位。 IEEE-754 32位单精度布局

seeeeeeeefffffffffffffffffffffff

这为我们提供了一个8位指数(可以表示值-126127)和一个22位有效数字(给出大约6到7个有效十进制数字)。符号位中的0表示正值,1表示负值。对指数进行编码,使000000012代表-126011111112代表0111111102代表127000000002 保留表示0和"非正规化"数字,而111111112保留用于表示无穷大和NaN)。此格式还假设隐藏的前导分数位始终设置为1。因此,我们表示为5.75的值1.01112 * 22将被编码为32位单精度浮点数

01000000101110000000000000000000
||      ||                     |
||      |+----------+----------+
||      |           |
|+--+---+           +------------ significand (1.0111, hidden leading bit)
|   |
|   +---------------------------- exponent (2)
+-------------------------------- sign (0, positive)

IEEE-754双精度浮点数使用11位作为指数(-10221023),52位作为有效数。我不打算写出来(这篇文章正在变成一本小说)。

由于指数,浮点数具有比整数更大的范围;指数127只需8位进行编码,但2127表示 38位十进制数。指数中的位越多,可以表示的值的范围越大。 precision (有效位数)由有效位数中的位数确定。有效数字中的位越多,您可以表示的数字越多。

大多数实际值不能将完全表示为浮点数;你不能将无限数量的值压缩成有限的位数。因此,可表示的浮点值之间存在间隙,并且大多数值将是近似值。为了说明这个问题,让我们看一下8位"四分之一精度"格式:

seeeefff

这为我们提供了-78之间的指数(我们不会担心像无穷大和NaN这样的特殊值)和带有隐藏前导位的3位有效数字。指数越大,表示值之间的差距越大。这是一个显示问题的表格。左栏是有效数字;每个附加列显示我们可以为给定指数表示的值:

sig    -1        0        1        2        3        4        5
---    ----      -----    -----    -----    -----    -----    ----
000    0.5       1        2        4         8       16       32
001    0.5625    1.125    2.25     4.5       9       18       36
010    0.625     1.25     2.5      5        10       20       40
011    0.6875    1.375    2.75     5.5      11       22       44
100    0.75      1.5      3        6        12       24       48
101    0.8125    1.625    3.25     6.5      13       26       52
110    0.875     1.75     3.5      7        14       28       56
111    0.9375    1.875    3.75     7.5      15       30       60

请注意,随着我们向更大的值移动,可表示值之间的差距会变大。我们可以在0.51.0之间表示8个值,每个值之间的差距为0.0625。我们可以在1.02.0之间表示8个值,每个值之间的差距为0.125。我们可以在2.04.0之间表示8个值,每个值之间的差距为0.25。等等。请注意,我们可以表示最多16的所有正整数,但我们无法以此格式表示值17;我们根本没有足够的有效位来这样做。如果我们以此格式添加值89,我们会得到16,这是一个舍入错误。如果在任何其他计算中使用该结果,则该舍入错误将是复合的。

请注意,无论您在有效位数中有多少位,都无法准确表示某些值。就像1/3为我们提供非终止小数部分0.333333...一样,1/10为我们提供了非终止二进制分数1.10011001100...。我们需要有效数字中的无限位来表示该值。

答案 1 :(得分:0)

64位机器上的双精度,有一个符号位,11个指数位和52个小数位。

认为(1符号位)*(52个小数位)^(11个指数位)