gpt4 book ai didi

c - 分配给 double 据类型的位数

转载 作者:行者123 更新时间:2023-11-30 18:39:20 25 4
gpt4 key购买 nike

64位中有多少位分配给double的整数部分和小数部分。还是有任何指定规则?

最佳答案

注意:我知道我已经回复了评论。这对我和OP都是有益的。尝试解释时,我总是会学到一些新东西。

浮点值(不考虑精度)如下所示:

    sign * significand * βexp 


其中 sign是1或-1, β是基数, 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写为 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表示 0,并且 111111102表示 127000000002 保留用于表示 0和“非规格化”数字,而 保留用于表示无穷大和NaN。此格式还假定隐藏的前导分数位始终设置为 111111112。因此,我们表示为 1的值 5.75将以32位单精度浮点数编码为

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


IEEE-754双精度浮点数将11位用于指数( 1.01112 * 22-1022),并将52位用于有效位数。我不会费心把它写出来(这篇文章已经变成了小说)。

由于指数的原因,浮点数的范围比整数大。指数 1023仅需要8位进行编码,但是 127表示38位十进制数字。指数中的位数越多,可以表示的值范围就越大。精度(有效位数)由有效位数决定。有效位数越多,可以表示的位数就越多。

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

seeeefff


这为我们提供了 2127-7之间的指数(我们不必担心无穷大和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


请注意,随着我们朝着更大的值前进,可表示值之间的差距也越来越大。我们可以表示 80.5之间的8个值,​​每个之间的间隔为 1.0。我们可以表示 0.06251.0之间的8个值,​​每个之间的间隔为 2.0。我们可以表示 0.1252.0之间的8个值,​​每个之间的间隔为 4.0。等等。请注意,我们可以表示直到 0.25的所有正整数,但是不能以这种格式表示值 16。我们根本没有足够的有效位数来做到这一点。如果以这种格式添加值 178,将得到 9作为结果,这是舍入错误。如果将该结果用于其他任何计算,则舍入误差将变得复杂。

请注意,无论有效位数中有多少位,都无法精确表示某些值。就像 16给我们无终止的小数部分 1/3一样, 0.333333...给我们无终止的小数部分 1/10。我们将需要无数个有效位数来表示该值。

关于c - 分配给 double 据类型的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30236655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com