知识点
参考:
例题(作业回顾)
【例子】 请将–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 都有可能)。