CSAPP阅读笔记4——数据编码4

浮点数2

舍入

对于浮点数的加法和乘法来说,我们可以先计算出准确值,然后转换到合适的精度。在这个过程中,既可能会溢出,也可能需要舍入来满足 frac 的精度。

在二进制中,我们舍入到最近的偶数,即如果出现在中间的情况,舍入之后最右边的值要是偶数,对于十进制数,例子如下:

1
2
3
4
5
  原数值       舍入结果    原因
2.8949999 2.89 #不到一半,正常四舍五入
2.8950001 2.90 #超过一般,正常四舍五入
2.8950000 2.90 #刚好在一半时,保证最后一位是偶数,所以向上舍入
2.8850000 2.88 #刚好在一半时,保证最后一位是偶数,所以向下舍入

对于二进制数也是类似的

1
2
3
4
5
  十进制    二进制     舍入结果  十进制    原因
2 又 3/32 10.00011 10.00 2 \\不到一半,正常四舍五入
2 又 3/16 10.00110 10.01 2 又 1/4 \\超过一般,正常四舍五入
2 又 7/8 10.11100 11.00 3 \\刚好在一半时,保证最后一位是偶数,所以向上舍入
2 又 5/8 10.10100 10.10 2 又 1/2 \\刚好在一半时,保证最后一位是偶数,所以向下舍入

浮点数加法

\[ (−1)^{s1}M_12^{E1}+(−1)^{s2}M_22^{E2} \]

这里假设 E1>E2,结果是 \((−1)^sM2^E\) ,其中 \(s=s1∧s2,M=M1+M2,E=E1\)

  • 如果 M 大于等于 2,那么把 M 右移,并增加 E 的值
  • 如果 M 小于 1,把 M 左移 k 位,E 减少 k
  • 如果 E 超出了可以表示的范围,溢出
  • 把 M 舍入到 frac 的精度

基本性质

  • 相加可能产生 infinity 或者 NaN
  • 满足交换率
  • 不满足结合律(因为舍入会造成精度损失,如 (3.14+1e10)-1e10=0,但 3.14+(1e10-1e10)=3.14
  • 加上 0 等于原来的数
  • 除了 infinity 和 NaN,每个元素都有对应的倒数
  • 除了 infinity 和 NaN,满足单调性,即 \(a≥b→a+c≥b+c\)

浮点数乘法

\[ (−1)^{s1}M_12^{E1}×(−1)^{s2}M_22^{E2} \]

结果是 \((−1)^sM2^E\),其中 \(s=s1∧s2,M=M1×M2,E=E1+E2\)

  • 如果 M 大于等于 2,那么把 M 右移,并增加 E 的值。
  • 如果 E 超出了可以表示的范围,溢出
  • 把 M 舍入到 frac 的精度

基本性质

  • 相乘可能产生 infinity 或者 NaN
  • 满足交换率
  • 不满足结合律(因为舍入会造成精度损失)
  • 乘以 1 等于原来的数
  • 不满足分配率 1e20*(1e20-1e20)=0.01e20*1e20-1e20*1e20=NaN
  • 除了 infinity 和 NaN,满足单调性,即 a≥b→a×c≥a×b

今日体重

又回去了,虽然跑了个一两天步,但感觉总体运动量还是不太够

image-20210809000841088