2019年9月22日
题目2.88
答案
|
格式A |
格式B |
||
|
位 |
值 |
位 |
值 |
|
1 01110 001 |
-9/16 |
1 0110 0010 |
-9/16 |
|
0 10110 101 |
+208 |
0 1110 1010 |
+208 |
|
1 00111 110 |
-7/(2^10) |
1 0000 0111 |
-7/(2^10) |
|
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.94
我的float_twice函数
1 /* Access bit-level representation floating-point number*/
2 typedef unsigned float_bits;
3
4 /* Compute 2*f. If f is NaN, then return f.*/
5 float_bits float_twice(float_bits f){
6 /* Decompose bit representation into parts */
7 unsigned sign = f&(1<<31);
8 unsigned exp = f&(0xFF<<23);
9 unsigned frac = f&0x7FFFFF;
10 // 特殊值:f = NaN or f = +-inf, 返回f本身
11 if(exp == (0xFF<<23)) return f;
12 // 非规格化:2.0*(float)f与2*(unsigned)f的低31位的位级表示一样
13 else if(!exp) return sign | (frac<<1);
14 // 最大的一些规格化:2.0*f溢出, 返回+-inf
15 else if(exp == (0xFE<<23)) return sign | (0xFF<<23);
16 // 其他的规格化:exp位+1
17 else return sign | (exp+(1<<23)) | frac;
18 }
我的测试函数
1 //测试函数
2 void MyTestFunc(float f){
3 //f = sqrt(-1); //本句用于测试f=NaN的情况
4 //unsigned f3 = 0x7f400000; f = *(float*)&f3; //本句用于测试2.0*f溢出的情况
5 float f2 = 2.0*f;
6 float_bits _f = *(unsigned*)&f,
7 _f2 = *(unsigned*)&f2,
8 flt_f = float_twice(_f);
9 printf("f = %f = 0x%.8x\n", f, _f);
10 printf("2.0*f = %f = 0x%.8x\n", f2, _f2);
11 printf("float_twice(f) = 0x%.8x\n", flt_f);
12 printf("(2.0*f == float_twice(f)) = %d\n\n", _f2 == flt_f);
13 return;
14 }
完整程序代码
1 /* 2 README: 3 本程序用float_twice()函数按位操作实现浮点数*2.0的计算,并提供了测试函数MyTestFunc()。 4 float_twice()函数的实现思路如下: 5 1.将传入的浮点数f的二进制序列划分为: 6 sign(仅保留符号位)、exp(仅保留23-30的阶码位)、frac(仅保留0-22的尾数位)三个部分; 7 2.根据exp值的分类进行*2运算: 8 (1)exp的8位全部为1——特殊值(f=NaN or f=+-inf), 返回f本身; 9 (2)exp的8位全部为0——非规格化,2.0*(float)f与2*(unsigned)f的低31位的位级表示一样; 10 (3)exp的8位为0xFE——最大的一些规格化:2.0*f溢出, 返回+-inf; 11 (4)所有其他情况——其他的规格化:exp位+1; 12 MyTestFunc()函数的功能如下: 13 1.测试输入一般浮点数的运行结果; 14 2.测试NaN的运行结果:需要在函数中运行“f = sqrt(-1);”这行代码; 15 3.测试2.0*f溢出的情况:需要在函数中运行“unsigned f3 = 0x7f000000; f = *(float*)&f3;”这行代码,f3的取值范围为0x7f000000~0x7f7fffff. 16 */ 17 #include <cstdio> 18 #include <cmath> 19 using namespace std; 20 21 /* Access bit-level representation floating-point number*/ 22 typedef unsigned float_bits; 23 24 /* Compute 2*f. If f is NaN, then return f.*/ 25 float_bits float_twice(float_bits f){ 26 /* Decompose bit representation into parts */ 27 unsigned sign = f&(1<<31); 28 unsigned exp = f&(0xFF<<23); 29 unsigned frac = f&0x7FFFFF; 30 // 特殊值:f = NaN or f = +-inf, 返回f本身 31 if(exp == (0xFF<<23)) return f; 32 // 非规格化:2.0*(float)f与2*(unsigned)f的低31位的位级表示一样 33 else if(!exp) return sign | (frac<<1); 34 // 最大的一些规格化:2.0*f溢出, 返回+-inf 35 else if(exp == (0xFE<<23)) return sign | (0xFF<<23); 36 // 其他的规格化:exp位+1 37 else return sign | (exp+(1<<23)) | frac; 38 } 39 40 //测试函数 41 void MyTestFunc(float f){ 42 //f = sqrt(-1); //本句用于测试f=NaN的情况 43 //unsigned f3 = 0x7f000000; f = *(float*)&f3; //本句用于测试2.0*f溢出的情况 44 float f2 = 2.0*f; 45 float_bits _f = *(unsigned*)&f, 46 _f2 = *(unsigned*)&f2, 47 flt_f = float_twice(_f); 48 printf("f = %f = 0x%.8x\n", f, _f); 49 printf("2.0*f = %f = 0x%.8x\n", f2, _f2); 50 printf("float_twice(f) = 0x%.8x\n", flt_f); 51 printf("(2.0*f == float_twice(f)) = %d\n\n", _f2 == flt_f); 52 return; 53 } 54 55 int main() { 56 float f; 57 while(printf("please enter a float : ")){ 58 scanf("%f", &f); 59 MyTestFunc(f); 60 } 61 return 0; 62 }