谁能解释浮点数在内存中的表示?


20

当我阅读上一个问题时,这不是重复的问题。

谁能帮助我理解how float values are stored in the memory

我的疑问是浮点值包含' .'for example 3.45'.'在内存中将如何表示?

有人可以用图表说明我吗?


21
最少期望的来源,维基百科怎么样?en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
您可以添加主要文章:IEEE浮点
mouviciel 2013年

4
如果您像我一样,并且喜欢通过玩东西,输入和接收输出等来学习,请访问以下站点:binaryconvert.com/convert_double.html
KChaloux

有多种WIDE浮点格式,所有格式都不同。IEEE浮点数是当今最常见的浮点数,但并不是唯一的浮点数。在读本科的时候,我必须学习CDC 6600浮点格式,它具有优于IEEE的优势,最大的优点是单精度的尾数为48位。IEEE的单精度尾数限制为大约24位,这就是为什么如今这些入门级数值方法课都告诉学生“总是使用双精度而不是浮点型”。
约翰·R·斯特罗姆

Answers:


44

小数点没有显式存储在任何地方;这是一个显示问题。

下面的解释是一个简化;我遗漏了许多重要的细节,我的示例并不代表任何实际平台。它应该使您了解如何在内存中表示浮点值以及与之相关的问题,但是您将希望找到更多权威性的资料,例如每位计算机科学家应该了解的浮点算术

首先以科学记数的形式表示浮点值,使用基数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之间的值。当将非常大(数量级)的数字乘以非常小的数字时,请务必小心。


“而不是保留另一个符号位”,您要描述的是带符号整数的确切行为。
西蒙(Simon)

6

.没有存储在所有。首先,您应该了解工程符号,该符号具有固定的精度因子和整数指数:1is 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为底。每个部分的确切大小取决于您使用的确切浮点标准。


3
这是“科学记数法”。“工程符号”是当指数被限制为3的倍数
克莱门特J.

7
使用基数2非常重要。它确定哪些值可以准确存储,哪些不可以存储,即使您不必费心去为哪些值创建直觉(我知道我也不能),您至少应该记住十进制数字是完全没有用的花车的思考方式。

1
@delnan:如果有帮助,尾数中的每一位都是高位的一半。因此,浮点数可以存储两个负幂的总和:1 / 2、1 / 4、1 / 8、1 / 16、1 / 32、1 / 64、1 / 128等,以尾数为上限。因此32位的epsilon float2^-22 * exponent或约为1/4194304。
greyfade13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.