64中有多少位分配给整数部分,而小数部分分配给double。或者是否有任何规则来指定它?
答案 0 :(得分:3)
注意:我知道我已经回复了评论。这和OP一样,对我自己有利;当我试图解释它时,我总是学到新东西。
浮点值(无论精度如何)表示如下:
sign * significand * βexp
其中 sign
为1或-1,β
为 base , exp
是一个整数指数, significand
是一个分数。在这种情况下,β
为2
。例如,实际值3.0
可以表示为1.102 * 21
,0.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位指数(可以表示值-126
到127
)和一个22位有效数字(给出大约6到7个有效十进制数字)。符号位中的0
表示正值,1
表示负值。对指数进行编码,使000000012
代表-126
,011111112
代表0
,111111102
代表127
(000000002
保留表示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位作为指数(-1022
到1023
),52位作为有效数。我不打算写出来(这篇文章正在变成一本小说)。
由于指数,浮点数具有比整数更大的范围;指数127
只需8位进行编码,但2127
表示 38位十进制数。指数中的位越多,可以表示的值的范围越大。 precision (有效位数)由有效位数中的位数确定。有效数字中的位越多,您可以表示的数字越多。
大多数实际值不能将完全表示为浮点数;你不能将无限数量的值压缩成有限的位数。因此,可表示的浮点值之间存在间隙,并且大多数值将是近似值。为了说明这个问题,让我们看一下8位"四分之一精度"格式:
seeeefff
这为我们提供了-7
和8
之间的指数(我们不会担心像无穷大和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.5
和1.0
之间表示8个值,每个值之间的差距为0.0625
。我们可以在1.0
和2.0
之间表示8个值,每个值之间的差距为0.125
。我们可以在2.0
和4.0
之间表示8个值,每个值之间的差距为0.25
。等等。请注意,我们可以表示最多16
的所有正整数,但我们无法以此格式表示值17
;我们根本没有足够的有效位来这样做。如果我们以此格式添加值8
和9
,我们会得到16
,这是一个舍入错误。如果在任何其他计算中使用该结果,则该舍入错误将是复合的。
请注意,无论您在有效位数中有多少位,都无法准确表示某些值。就像1/3
为我们提供非终止小数部分0.333333...
一样,1/10
为我们提供了非终止二进制分数1.10011001100...
。我们需要有效数字中的无限位来表示该值。
答案 1 :(得分:0)
64位机器上的双精度,有一个符号位,11个指数位和52个小数位。
认为(1符号位)*(52个小数位)^(11个指数位)