计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

目录

2.3 整数运算

2.3.1 无符号加法

2.3.2 补码加法

2.3.3 补码的非

2.3.4 无符号乘法

2.3.5 补码乘法

2.3.6 乘以常数

2.3.7 除以2的幂

2.3.8 关于整数运算的最后思考

2.4 浮点数

2.4.1 二进制小数

2.4.2 IEEE浮点表示

2.4.3 数字实例

2.4.4 舍入

2.4.5 浮点运算

浮点数加法

浮点数乘法

2.4.6 C语言的浮点数


 

2.3 整数运算

 

 

 

 

 

算术运算: 基本规则

  • 加法:
    • 无/有符号数的加法: 正常加法后再截断,位级的运算相同
    • 无符号数:加后对2w求模
      • 数学加法 + 可能减去 2w
    • 有符号数: 修改的加后对 2w 求模,使结果在合适范围
      • 数学加法 + 可能减去或加上 2w
  • 乘法:
    • 无/有符号数的乘法:正常乘法后加截断操作,位级运算相同
    • 无符号数:乘后对2w求模
    • 有符号数: 修改的乘后对 2w 求模,使结果在合适范围内

 

 

 

 

  • 无符号整数、补码整数是同构环(isomorphic rings)
    • 同构 = 类型转换  (isomorphism = casting)
  • 左移
    • 无论有/无符号数,都可用逻辑左移实现乘以 2k
  • 右移
    • 无符号数: 逻辑右移,除以 2k (除法 +0舍入)
    • 有符号数: 算术右移
      • 正整数:除以 2k (除法 + 向0舍入)
      • 负整数:除以 2k (除法 + 远离0舍入),使用偏置来修正

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.3.1 无符号加法

 

 

 

 

 

 

 

 

 

 

 

  • 操作数:w位
  • 真实和:w+1位
  • 丢弃进位后:w位

 

 

 

 

 

 

 

 

 

 

  • 数值面有弯折
  • 非饱和运算——不单调
  • 当真实和>=2^w时溢出
  • 最多溢出一次

 

 

 

 

 

 

 

2.3.2 补码加法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 真实和需要w+1
  • 丢弃最高有效位(MSB)
  • 将剩余的位视作补码(整数)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

判断补码是否超范围:

  • 正常: Xh != Yh Xh==Yh==Zh
  • 溢出: Xh==Yh != Zh

 

 

 

 

 

 

 

 

 

2.3.3 补码的非

注意:在w位最小值取非时,值不变

2.3.4 无符号乘法

w位和w位无符号数做乘法,2w位取低w位

即截断为w位,等价于该值模2^w

2.3.5 补码乘法

 

 

 

 

 

  • 标准乘法功能
    • 忽略高w位
    • 有符号数乘、无符号数乘有不同之处:
      •  乘积的符号扩展
    • 乘积的低位相同

 

 

 

 

 

 

 

2.3.6 乘以常数

 

 

 

 

 

  • 乘法指令很慢
  • 移位+加法---代替--->乘法
  • 重点考虑乘以2的幂

 

优化

 

 

 

2.3.7 除以2的幂

算术右移k位=除以2的k次方

2.3.8 关于整数运算的最后思考

  • 一定要知道隐含的转换规则,否则不要用:
    • 常见错误
      • unsigned i;
      • for (i = cnt-2; i >= 0; i--)
      •   a[i] += a[i+1];
    • 不易察觉的问题
      • #define DELTA sizeof(int)     //sizeof()类型unsigned
      • int i;
      • for (i = CNT;  i - DELTA >= 0; i -= DELTA)
      •   . . .

2.4 浮点数

2.4.1 二进制小数

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 表示的有理数:    𝑖=−𝑛𝑚𝑏𝑖×2𝑖
  • “小数点”右边的位代表小数部分

 

 

 

 

 

 

 

 

局限性

  • 近似表示
    • 只能精确表示形如 x/2k的数值
    • 其他有理数的二进制表示存在重复段
    • 数值    二进制表示
      • 1/3    0.0101010101[01]2
      • 1/5    0.001100110011[0011]2
      • 1/10    0.0001100110011[0011]2
  • 在计算机内的实现问题
    • 长度有限的w位
    • 只能在w位内设置一个二进制小数点
    • 限制了数的范围
  • 定点数
    • 小数点隐含在w位编码的某一个固定位置
    • 例如MSB做符号位,隐含后面是小数点,表示小于1.0的纯小数123.456怎么办???

 

 

 

 

2.4.2 IEEE浮点表示

IEEE标准754

  • 快速、易于实现
  • 精度损失小
  • 优雅、易理解
  • 所有主流CPU都支持
  • 之前有很多不同格式、不太关注精确性

 

 

 

 

 

 

 

 

  • 尾数(Significand) 编码隐含先导数值1: M  =  1.xxx…x
    •  xxx…x: 是 frac字段的数码
    • frac=000…0 (M = 1.0)时,为最小值
    • frac=111…1 (M = 2.0 – ε)时,为最大值
    • 额外增加了一位的精度(隐含值1)
      • 非规则化没有默认1.xxx
  • 条件:exp≠000…0 exp≠111…1
  • 阶码采用偏置值编码:
    • E=Exp-Bias
    • Exp:exp字段的无符号数值
    • Bias偏置:2k-1 - 1,  k 为阶码的位数
      • 单精度:127 (Exp: 1…254, E: -126…127)
      • 双精度: 1023 (Exp: 1…2046, E: -1022…1023)
  • 规则化数

 

 

 

 

  • 条件: exp = 000…0
    • 阶码(Exponent) 值: E = 1 – Bias =-126/-1022(instead of E = 0 – Bias)
    • 尾数(Significand)编码隐含先导数值0: M = 0.xxx…x2
      • xxx…x:是 frac字段的数码
  • 情况1: exp = 000…0, frac = 000…0
    • 表示值0
    • 注意有不同的数值 +0 和 –0 (why?)
  • 情况2:exp = 000…0, frac ≠ 000…0
    • 最接近0.0的那些数
    • 间隔均匀
    • 逐渐下溢
  • 非规则化数
  • 条件:阶码全为1,exp = 111…1
  • 当小数域全为0,frac=000…0
    • 当s=0时
      • 值:+∞
    • 当s=1时
      • 值:-∞
  • 当小数域非0
    • NaN(Not a Number)
  • 特殊值

2.4.3 数字实例

规格化浮点数表示范围

  • 单精度:
    • 约 +3.4 X 1038
  • 双精度
    • 约 +1.8 X 10308

2.4.4 舍入

  • 基本思想
    • 首先,计算精确结果
    • 然后,变换到指定格式
      • 可能溢出阶码太大
      • 小数部分可能需要舍入

默认:向偶数舍入

  • 其他方法都有统计偏差,对正整数集合求和时,和将始终被低估或高估(负偏差、正偏差)
  • 当恰好在两个可能的数值正中间时(中间值):
    • 舍入后,最低有效位的数码为偶数,即最低有效位值为0
      • 7.8950000        7.90        (中间值—向上舍入)
      • 7.8850000        7.88        (中间值—向下舍入)
  • 其他时候:
    • 向最近的数值舍入
    • 比中间值小向下舍入,比中间值大向上舍入
      • 7.8949999        7.89        (比中间值小:向下舍入)
      • 7.8950001        7.90        (比中间值大:向上舍入)

2.4.5 浮点运算

 

 

 

 

 

浮点数加法

  • (–1)s1 M1  2E1   +   (-1)s2 M2  2E2
    • 假设 E1 > E2
  • 准确结果: (–1)s M  2E
    • 符号 s, 尾数M:
      • 有符号数对齐、相加的结果
    • 阶码(Exponent) E:     E1
  • 修正
    • M ≥ 2:将M右移(1位),E加1
    • M < 1:将M左移k 位, E 减 k
    • E超范围:溢出
    • 将M舍入,以符合小数部分的精度要求
  • 数学性质:
    • 封闭性
    • 交换性
    • 分配性 No!
      • 溢出和舍入的不确定性
        • (3.14+1e10)-1e10 = 0
        • 3.14+(1e10-1e10) = 3.14
    • 单调性
      • a ≥ b ⇒ a+c ≥ b+c
      • 除了无穷和NaN

 

浮点数乘法

  • (–1)s1 M1  2E1   x   (–1)s2 M2  2E2
  • 精确结果: (–1)s M  2E
    • 符号(Sign) s:         s1 ^ s2
    • 尾数(Significand) M:     M1 x  M2
    • 阶码(Exponent) E:     E1 + E2
  • 修正
    • M ≥ 2, M右移(1), E1
    • E 超出范围,则溢出
    • M舍入,以符合小数部分的精度要求
  • 实现
    • 主要问题:实现尾数的乘
  • 数学性质
    • 封闭性
      • 但可能产生无穷或NaN
    • 交换性
    • 结合性 No!
      • 可能溢出、舍入不精确
        • (1e20*1e20)*1e-20= inf
        • 1e20*(1e20*1e-20)= 1e20
    • 1是乘法的单位元
    • 乘法对加法的分配性?No
      • 可能溢出、舍入不精确
        • 1e20*(1e20-1e20)= 0.0
        • 1e20*1e20 – 1e20*1e20 = NaN
    • 单调性
      • a ≥ b  & c ≥ 0  a * c ≥ b *c?
      • 除了无穷和NaN

 

 

 

2.4.6 C语言的浮点数

  • 两种精度
    • float    单精度
    • double    双精度
  • 类型转换
    • int, float, double 间转换,将改变位模式
    • double/float → int
      • 截掉小数部分
      • 类似向0舍入
      • 当数值超范围或NaN时无定义:通常设置为 TMin
    • int → double
      • 精确转换,只要int的位宽 ≤ 53 bit,即可精确转换
    • int → float
      • 将根据舍入模式进行舍入

 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值