/*****************2.83**********************/
(!sx && sy) || (sx && sy && (ux <= uy)) || (!sx && !sy && (ux >= uy))
/*****************2.84**********************/
A. E = 2; M = 5/4; f = 1/4; V = 5.0
B. n位小数全为1。 E = n; M = 2 - 1/(2^n); f = 1 - 1/(2^n); V = 2^n * ( 2 - 1/(2^n) ) = 2^(n + 1) - 1
C. 最小规格化数: E = 2 - 2^(k - 1); M = f = 2^(-n); V = 2^E * M; 倒数为1/V
/***********2.85**************/
2^(-16445)
2^(-16382)
2^16384 - 2^16320
/*************2.86*****************/
为了简单起见,省略表格
Hex M E V
0x8000 0 -62 -
0x3f01 257/256 0 257/256
0x4700 1 8 -
0x00ff 255/256 -62 2^-62 * 255/256
0xff00
- 13/8 -5 13/256
/*************2.87*****************/
1 01110 001 -9/16 1 0110 0010 -9/16
0 10110 101 208 0 1110 1010 208
1 00111 110 7/1024 1 0000 0111 7/1024
0 00000 101 5/2^17 0 0000 0000 0
1 11011 000 -2^12 1 1111 0000 负无穷
0 11000 100 768 0 1111 0000 正无穷
/*************2.88********************/
A. 当x取MAX_INT时不成立,因为此时x转为float时有精度丢失
B. 当 x+y 发生溢出时不成立
C. 成立,虽然double类型不满足结合律,但该表达式永远不会发生溢出
D. 不成立,乘法可能会导致精度溢出
E. 当x = 0 y不等于0时不成立
/***********2.89*************/
float fpwr2(int x)
{
unsigned exp,frac;
unsigned u;
if(x < -149){
/*Too small. Return 0.0*/
exp = 0;
frac = 0;
}else if(x < -126){
/*Denormalized result*/
exp = 0;
frac = 0x800000 >> (126 - x);
}else if(x < 128){
/*Normalized result*/
exp = x + 127;
frac = 0;
}else{
/*Too big Return +00*/
exp = 0xff;
frac = 0;
}
u = exp << 23 | frac;
return u2f(u);
}
/**************2.90*****************/
A. 11.0010 0100 0011 1111 0110 11
B. 11.001001001001(001...)
C. 223/71 和 22/7 大概相差1/500,故从小数点后第九位开始不同