当我阅读上一个问题时,这不是重复的问题。
谁能帮助我理解how float values are stored in the memory
。
我的疑问是浮点值包含' .'
(for example 3.45
)'.'
在内存中将如何表示?
有人可以用图表说明我吗?
当我阅读上一个问题时,这不是重复的问题。
谁能帮助我理解how float values are stored in the memory
。
我的疑问是浮点值包含' .'
(for example 3.45
)'.'
在内存中将如何表示?
有人可以用图表说明我吗?
Answers:
小数点没有显式存储在任何地方;这是一个显示问题。
下面的解释是一个简化;我遗漏了许多重要的细节,我的示例并不代表任何实际平台。它应该使您了解如何在内存中表示浮点值以及与之相关的问题,但是您将希望找到更多权威性的资料,例如每位计算机科学家应该了解的浮点算术。
首先以科学记数的形式表示浮点值,使用基数2而不是基数10。例如,值3.14159可以表示为
0.7853975 * 2 2
0.7853975是有效位数,又称为尾数;它是包含有效数字的数字部分。将该值乘以2的底数乘以2的乘方得到3.14159。
通过存储有效位数和指数(以及符号位)来对浮点数进行编码。
典型的32位布局如下所示:
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
与带符号整数类型一样,高阶位表示符号;0表示正值,1表示负值。
接下来的8位用于指数。指数可以是正数或负数,但不是保留另一个符号位,而是对其进行编码,以使10000000表示0,因此00000000表示-128,11111111表示127。
其余位用于有效位。从左边开始,每一位代表2的负幂,因此:
01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 = 0.25 + 0.125 + 0.03125 = 0.40625
一些平台假定有效数字中的“隐藏”前导位始终设置为1,因此有效数字中的值始终在[0.5,1)之间。这允许这些平台以稍高的精度存储值(更多信息请参见下文)。我的示例没有这样做。
因此,我们将3.14159的值表示为
0 10000010 11001001000011111100111 ^ ^ ^ | | | | | + ---有效位数= 0.7853975 ... | | | + -------------------指数= 2(130-128) | + -------------------------符号= 0(正) 值= -1 (符号) * 2 (指数) *(有效位数) 值= -1 0 * 2 2 * 0.7853975 ... 值= 3.14159 ...
现在,如果将有效位数中的所有位加起来,您会发现,它们之和不等于0.7853975;他们实际上是0.78539747。没有足够的位来精确存储值;我们只能存储一个近似值。有效位数的位数决定精度或可以存储的有效位数。23位使我们可以精确到6个十进制数字。64位浮点类型提供有效位数,足以提供大约12到15位的精度。但要注意,有无法表示的值究竟不管如何您使用了很多位。正如不能以有限数量的十进制数字表示类似1/3的值一样,也不能以有限数量的位数表示类似1/10的值。由于值是近似值,因此使用它们的计算也是近似值,并且舍入误差会累积。
指数中的位数确定范围(可以表示的最小值和最大值)。但是,随着您朝着最小值和最大值迈进,可表示值之间的差距越来越大。也就是说,如果您不能精确地表示介于0.785397和0.785398之间的值,那么您将无法精确地表示介于7.85397和7.85398之间的值,或介于78.5397和78.5398之间的值,或介于785397.0和785398.0之间的值。当将非常大(数量级)的数字乘以非常小的数字时,请务必小心。
在.
没有存储在所有。首先,您应该了解工程符号,该符号具有固定的精度因子和整数指数:1
is 1.0·10 0 = 1.0E0
,2 is 2.0E0
,10 is 1.0E1
等。这允许使用非常短的大数表示法。十亿是1.0E9
。之前的因数E
通常表示为固定精度数字:1.00000E9
。由此产生的结果是,当精度不够大时,十亿个和一个 = 1,000,000,001个和十亿个都相同。还要注意,该因子永远不需要前导零。取而代之的是,指数可以递减,直到情况不再如此。
在内存中,浮点数以类似的方式表示:一位具有符号,有些位构成因子为固定精度数(“尾数”),其余位构成指数。当然,现在以10为基数的工程符号的区别是指数以2为底。每个部分的确切大小取决于您使用的确切浮点标准。
float
为2^-22 * exponent
或约为1/4194304。