Site Overlay

CSAPP 复习笔记:浮点数据类型

知识点

参考:

例题(作业回顾)

【例子】 请将–35/64表示成IEEE 754标准的32位浮点规格化数(表示为16进制)。

【例子】 请将–35/64表示成IEEE 754标准的32位浮点规格化数(表示为16进制)。

【分析与解答】 IEEE754 的浮点数表示公式为:

$$
V = (-1) ^ s M 2^E
$$

对于 32bit 浮点数,1 bit 表示 s,8 bit 表示 E,23 bit 表示 M。指数部分,实际的指数 e 是 $e = E - 2^{(8 - 1)}$。
对于 64bit 浮点数,1 bit 表示 s,11 bit 表示 E,52 bit 表示 M。

对于 $-35/64$,首先将其转换为二进制。

$$
-\dfrac{35}{64} = - (\dfrac{32}{64} + \dfrac{2}{64} + \dfrac{1}{64})\
= - (\dfrac{1}{2} + \dfrac{1}{32} + \dfrac{1}{64})\
= - (2^{-1} + 2^{-5} + 2^{-6})
= - 0.100011_{(2)}
$$

$$
-0.100011_{(2)} = (-1)^{1} 1.00011 \cdot 2 ^{-1}
$$

符号 s 部分,直接取 1 就行,因为 $-1^{1} = -1$,使得小数为负数了。

$e = -1 = E - 127 \Rightarrow E = 126 = 01111110$

至于 M 部分是省略 1.00011 的 1 的,直接从小数后面开始,而且是从左到右的。也就是 00011

表示出来就是

[1][01111110][000 1100 0000 0000 0000 0000]

即:

1011 1111 0000 1100 0000 0000 0000 0000
b    f    0    c    0    0    0    0

写成十六进制就是:

0xbf0c0000

【例子】 假定变量x、f和d的类型分别是int、float 和double。 除了f和d都不能等于十∞、一∞或者NaN,它们的值是任意的。对于下面每个C表达式,证明它总是为真(也就是求值为1), 或者给出一个使表达式不为真的值(也就是求值为0)。

A. x==(int)(double)x

B. x== (int)(float)x

C. d==(double)(float)d

D. f == (float)(double)f

E.f == -(- f)

F. 1.0/2 == 1/2.0

G. d * d >= 0.0

H.(f+d)- f == d

【分析与解答】

A. 进行 double 转换是精确的,转换回来也是原来的整数。真。

B. float 不一定能容纳 x,可能溢出。比如 x = INT_MAX 为成假赋值。

C. float 不一定能容纳 d,可能溢出。

D. 不会溢出。真。

E. 真。符号位和其它位没关系。

F. 真。转换为浮点数运算,两边转换后一样。

G. 真。即使溢出也不会影响符号,最多变成无穷大。

H. f+d 可能会溢出。

例题(快速复习制卡专用)

【例子】 用 IEEE 754 标准 32 位浮点数表示十进制小数 0.5

0.5 = (-1)^0 (1.0) 2^(-1),所以 S = 0, M = 0, e = E - 127 = -1 => E = 126

S: 0
E: 01111110
M: 000 0000 0000 0000 0000 0000

0.5 = 0011 1111 0000 0000 0000 0000 0000 0000

【例子】 用 IEEE 754 标准 32 位浮点数表示十进制小数 1.5

1.5 = 2^0 + 2^-1 = [1.1], S = 0, M = 1, e = E - 127 = 0 => E = 127

S: 0
E: 01111111
M: 100 0000 0000 0000 0000 0000

1.5 = 0011 1111 1100 0000 0000 0000 0000 0000

【例子】 用 IEEE 754 标准 32 位浮点数表示十进制小数 -12.5

-12.5 = -1 [1100.1] = (-1)^[1.1001] 2^3. S = 1, M = [1001] E = 127 + 3 = 130 = 1000 0010
-12.5 = 1100 0001 0100 1000 0000 0000 0000 0000

(注意 e 大于零的情况!)

【例子】 求浮点数 0x41360000 的十进制表示。

0x41360000 = [0100 0001 0011 0110 0000 0000 0000 0000]

S: 0
E: [1000 0010] = 130 e = E - 127 = 3
M: 011 0110 0000 0000 0000 0000

可得 1.011011 x 2^3 = 1011.011 = (8+2+1).(0.25 + 0.125) = 11.375

(注意 e > 0 时把 M 的数位进行相应移动)

【例子】 x == (int)(double)x

true,因为 double 的范围和精度都大于 int

【例子】 x == (double)(float)x

false,因为存在这样的情况: (float)x 溢出 而作为 double 的 x 不溢出。

【例子】 1.0/2 == 1/2.0

true,不管是在前还是在后,都会两个一起转换为 float 进行计算。

【例子】 d*d > 0.0

true,因为即使溢出也会得到正无穷。

【例子】 浮点数和整数比较时,会怎样转换?

整数转换为相应的浮点数(int -> double, int -> float 都有可能)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注