0
点赞
收藏
分享

微信扫一扫

COA-2019-第三章-Integer, Floating-point and Decimal Representation


Integer, Floating-point and Decimal Representation

  • 1. 数据的二进制表示
  • 1.1. 补码
  • 1.2. 数据移动
  • 1.2.1. 补码的具体计算
  • 2. 浮点数操作
  • 2.1. 浮点数
  • 2.2. IEEE754标准
  • 2.2.1. IEEE754标准要求
  • 2.2.2. 计数法约定
  • 2.2.3. 表示范围
  • 2.2.4. 问题解决:表示靠近0的比较小的数字
  • 2.2.5. 问题解决:特别大的数
  • 2.2.6. 总共能表示的数字的数量
  • 2.3. 如何调整后这个模型
  • 2.4. 扩展版——64位
  • 2.5. 例子
  • 3. 其他的要求存在的问题
  • 3.1. NBCD(W8421)

1. 数据的二进制表示

  1. 为表示出多个数值,必须对多个位进行组合
  • 如果有k位,最多能区分2k个不同的值。
  1. 整数类型:
  1. 无符号整数:0 - (2k-1)
  2. 有符号整数:( - 2k-1 - 2k-1-1)
  1. 原码、反码、补码
  2. 原码和反码在进行加法运算时都会造成不必要的硬件需求,于是出现了补码
  3. 二进制补码转换
  4. 二进制-十进制转换
  1. 常见问题:
  1. 只能确定最多表示多少个数,而不能确定具体表示啥。

1.1. 补码

  1. 可以解决正负数相加减的问题。
  • 但是不会影响其加减的运算能力。
  1. 补码是原码的"取反加一"。
  2. 为什么会存在补码?
  1. 比如用钟表表示(-6)-5,可以看成就是把大的数字减去12,得到的即可。
  2. 接下来类比,我们找到0,按照顺序来排位我们可以知道(1000····0是最最小的),接下来1开头的所有的数字的无符号值,减去2k得到的就是实际的负值。
  3. 那么接下来如何计算呢?
  1. x补码+(-x)补码 = 2k
  2. 证明为什么是取反加一:(-x)补码 = ((2k-1) - x补码) + 1
  • 对应取反加一

1.2. 数据移动

  1. 逻辑左移:右端补充0
  2. 算术左移:右端补充0
  3. 逻辑右移:左侧补充0
  4. 算术右移:左侧补充符号位

1.2.1. 补码的具体计算

  1. 过程:
  1. 数值=xk-1*2k-1 + ··· + x1*21+ x0*20 - xk-1*2k(最大值,类比为12)
  2. = -xk-1*2k-1 + xk-2*2k-2 + ··· + x1*21 + x0*20
  1. 用数轴来解释,所以是在数轴上平移到右边,所以是取模的操作。

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码

2. 浮点数操作

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码_02

  1. 为什么我们需要表示浮点数?
  • 除了整数以外,我们还有很多浮点数的操作。
  1. 规定小数点的位置,小数点的位置可以来区分不同的浮点数,那么我们为什么不使用这样的方法?(定点数)
  • 因为这样的话,精度每提高一位,窗口缩小一倍,浮点数表示的范围比较大。
  • (-2k-1-(2k-1-1))*2-1
  1. 为什么浮点数可以表示一个更大的范围?
  • 牺牲了比较大的部分的精度。

2.1. 浮点数

COA-2019-第三章-Integer, Floating-point and Decimal Representation_linux_03

  1. 符号只需要一位。
  2. 基数是确定的,自己约定好的。

2.2. IEEE754标准

COA-2019-第三章-Integer, Floating-point and Decimal Representation_数据_04

  1. 固定小数点位数:定下x的小数点位置。

2.2.1. IEEE754标准要求

COA-2019-第三章-Integer, Floating-point and Decimal Representation_linux_05

COA-2019-第三章-Integer, Floating-point and Decimal Representation_linux_06

2.2.2. 计数法约定

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码_07

  1. 理论上我们可以表示出来所有的数字,总能移到1出现的位置。
  2. 偏移量为设定为127,基数设定为2。

2.2.3. 表示范围

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码_08

  1. 符号位:正负
  2. 指数范围:-127-128
  3. 数值范围:1-(2-2-23)(1.111…1)
  4. 能表示的数字总数一定为什么表示的范围增大了?
  • 稀疏了,在原来的里面变化是均匀的
  • 每次E变大的时候,会造成在小的时候的间隔是2-23-127,而在大的时候的间隔是2-23+128
  1. 为什么这样子表示有意义的?
  • 对于一个很大的数,只要能保证一个大致的量即可,比较小的量无关紧要。
  • 而对很小的数就有意义。
  1. 所以在2-1-1.111…1中有223份的每一份,1.111…1和20这个距离是相同的。
  • 越靠近0越密
  1. 问题:存在无法表示的位置,-2-127和2-127无法进行表示。无法表示0。
  1. 从总体上来讲,这个问题比较小。
  2. 但是从相邻的2-126中可以看到这是很大的。
  1. 问题解决:想要表示这些数据,我们就需要牺牲一部分表示别的的数字来表示中间的部分。

2.2.4. 问题解决:表示靠近0的比较小的数字

COA-2019-第三章-Integer, Floating-point and Decimal Representation_linux_09

  1. 我们使用特殊的规定来表示这样的数字。
  2. 基数E为0,但是值S不全为0,这部分拿出来,重新布局到-2-126-2-126这部分中去,一共有224-2个元素。
  • 这时候我们只要在前面加上0.bbb…b即可,也就是0.bbb…b*2-126
  • 这时候我们就需要乘以2-126
  1. 基数E不为0,S也不为0,是1.bbb…b*2E-127

2.2.5. 问题解决:特别大的数

  1. 正无穷,负无穷:基数255

2.2.6. 总共能表示的数字的数量

  1. 232
  2. -2+1(0)
  3. -2+2(NaN)
  4. -(223-1)*2+1(无穷大)
  5. 总体上比232要小。

2.3. 如何调整后这个模型

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码_10

  1. B大一点:会影响精度
  • 里面会变密,外面会变稀疏
  • 外面会快很多。
  1. 把指数位变大:棍子会减少

2.4. 扩展版——64位

COA-2019-第三章-Integer, Floating-point and Decimal Representation_数据_11

2.5. 例子

COA-2019-第三章-Integer, Floating-point and Decimal Representation_补码_12

3. 其他的要求存在的问题

COA-2019-第三章-Integer, Floating-point and Decimal Representation_浮点数_13

  1. 浮点数在表示比较大的数字的时候,精度比较低。
  2. 定点数的问题:范围会减少。
  3. 问题:我们需要比较大的数字,也许要比较高的精度。

3.1. NBCD(W8421)

COA-2019-第三章-Integer, Floating-point and Decimal Representation_linux_14

  1. 符号位置:
  1. 1100是正号。或者0
  2. 1101是负号。或者1
  1. 好处和优点:
  1. 十进制和BNCD的转换很自然很准确
  2. 也支持小数,有几位也都可以


举报

相关推荐

0 条评论