《CSAPP》浮点数+浮点数运算(第二章)

浮点数

二进制小数(定点表示法)

二进制小数:101.11
小数点左边的位的权是2的正幂,点右边的位的权是2的负幂。即表示十进制数:1*2^2+0*2^1+1*2^0+1*2^-1+1*2^-2=4+0+1+1/2+1/4=5(3/4)
小数点左移一位相当于这个数被2除,右移一位相当于将该数乘2。

IEEE浮点表示

定点表示法不能很有效的表示非常大的数字。
IEEE浮点标准用 V=(-1)^s*M*2^E 的形式来表示一个数。

  • 符号:s决定这数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊情况处理。(s)
  • 尾数:M是一个二进制小数。(exp)
  • 阶码:E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。(frac)

将浮点数的位表示划分为三个字段(s,exp,frac),分别对这些值进行编码。
单精度浮点格式:s、exp、frac字段分别为1位、k=8位和n=23位。得到一个32位的表示
双精度浮点格式:s、exp、frac字段分别为1位、k=11位和n=52位。得到一个64位的表示

单精度浮点数值的分类(阶码的值决定了这个数是规格化的、非规格化的或特殊值)

+0.0和-0.0都是非规格化数。

舍入

有四种舍入方式:向偶数舍入、向零舍入、向下舍入、向上舍入。
向偶数舍入,也称为向最接近的值舍入,是默认的方式,试图找到一个最接近的匹配值。向偶数舍入采用的方法是:它将数字向上或者向下舍入,使得结果的最低有效数字是偶数,因此,这种方法将1.5和2.5都舍入成2了。
向零舍入方式是把正数向下舍入,把负数向上舍入。
向下舍入是把正数和负数都向下舍入。
向上舍入是把正数和负数都向上舍入。

浮点运算

  1. 浮点加法
    x和y浮点运算可以看作实数进行运算。
    加法运算是可交换的(x+y=y+x),但是是不可结合的。加法也满足单调性属性。

  2. 浮点乘法
    是可交换的,不具有结合性,满足单调性。

C语言中的浮点数

float和double相当于单精度和双精度。

int、float、double格式之间进行强制类型转换时,有如下原则:

  • 从int转换成float,数字不会溢出,但是可能被舍入。
  • 从int或float转换成double,能够保留精确的精度。
  • 从double转换成float,因为范围小,值可能溢出成正无穷或者负无穷,另外因为精度小,还可能被舍入。
  • 从float或double转换成int,值将会向零舍入。
文章目录
  1. 1. 浮点数
    1. 1.1. 二进制小数(定点表示法)
    2. 1.2. IEEE浮点表示
    3. 1.3. 舍入
    4. 1.4. 浮点运算
    5. 1.5. C语言中的浮点数