知识点
参考:
例题(作业回顾)
【例子】 请将–35/64 表示成 IEEE 754 标准的 32 位浮点规格化数(表示为 16 进制)。
【例子】 请将–35/64 表示成 IEEE 754 标准的 32 位浮点规格化数(表示为 16 进制)。
【分析与解答】 IEEE754 的浮点数表示公式为:
对于 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$,首先将其转换为二进制。
符号 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 都有可能)。