Loading...
墨滴

CG

2021/07/23  阅读:23  主题:默认主题

浮点数在计算机中的存储

极简版

  1. 浮点数在计算机中分为三个字段存储:
    1. 符号位。
    2. 尾数位。
    3. 指数位。

什么是浮点数

1.03.141.3333333都是浮点数。

在C语言中,float(单精度)和double(双精度)都是浮点数类型。

浮点数只能“近似”存储。存储在计算机中的浮点数不是程序员期望中的百分百相同的数值。

存储方式

科学计数法

什么是科学计数法?回忆一下中学数学知识,100还能写成哪些形式?

15478能?

用下面这种形式表示数字的方法就叫科学计数法。

把上面公式右边两个乘号连接起来的三个部分分别记作A、B、C。

  1. A:符号位。
    1. s是0时,这个数的符合位是“正”。
    2. s是1时,这个数的符合位是“负”。
  2. B:尾数。例如,1.5478的小数部分.5478就是尾数。
  3. C:C中的E就是指数。

浮点数的IEEE标准

IEEE

IEEE是一个协会或组织。很多电气、计算机相关的规则出自这个组织。

标准

计算机中存储浮点数的方法也出自IEEE。

存储浮点数的方式和科学计数法类似,只需把上面的科学计数法公式做一些修改。

显而易见,存储浮点数时,把“底数”从10换成了2

分配给S、M、E的存储空间是固定的。

8个bit存储浮点数

用一个字节存储浮点数,空间分配如下:

  1. S:占用1个bit。
  2. E:占用3个bit。
  3. M:占用4个bit。
32个bit存储浮点数
  1. S:占用1个bit。
  2. E:占用8个bit。
  3. M:占用23个bit。
64个bit存储浮点数
  1. S:占用1个bit。
  2. E:占用11个bit。
  3. M:占用52个bit。
究竟怎么分配空间

8个bit存储浮点数是为了帮助理解而设计的最简单的存储方式,并没有在实际中使用。

float类型用32个bit存储浮点数。double类型用64个bit存储浮点数

例子

float a = 1.25怎么用8个bit存储?

  1. S:占用1个bit,数据是0
  2. M:占用4个bit,数据是0001
  3. E:占用3个bit,数据是101

全景展示这个字节中的数据如下:

元素 S E E E M M M M
内存地址 7 6 5 4 3 2 1 0
数据 0 1 0 1 0 0 0 1

也就是说,1.25存储到计算机中的数据是01010001

细心的读者分析存储到计算机中的1.25后会发现:

  1. S的值没问题。
  2. M的值是:0001
    1. 1.25的分数形式是
    2. 0001 有任何相似之处吗?
  3. E的值是:101
    1. 指数应该是-2,可为啥是101

逐一回答上面的问题。

M

第一个,关于M的问题。

当E不全为0或1时,M的小数点右边默认是1,为了节约存储空间,不存储到计算机中。从计算机中获取数据时,自动加上小数点右边的1。

本例的计算过程是这样的:

  1. 从计算机中获取M的值是001
  2. E的值是-2。后面再解释。
  3. 中间值
  4. 最终值
E

E的值是-2,怎么计算出来的?

  1. 在本例中,偏置量 = 7。
  2. 01010001中,E的值是5,还原成人类可视的表达式,E的值应该是:5-7 = -2。
  3. 总结一下,在人类可视的表达式中,E = 计算机中的E - 偏置量。

浮点数和十进制数的转换

待续。

CG

2021/07/23  阅读:23  主题:默认主题

作者介绍

CG