2019年9月22日

 

题目2.88

计算机系统导论——小班作业(2)——浮点数的位级表示

计算机系统导论——小班作业(2)——浮点数的位级表示

答案

格式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)——浮点数的位级表示

 

 

题目2.94

计算机系统导论——小班作业(2)——浮点数的位级表示

我的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 }
View Code

我的测试函数 

 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 }
View Code

完整程序代码 

 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 }
View Code

相关文章:

  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-06-16
  • 2021-12-02
  • 2021-04-22
猜你喜欢
  • 2021-09-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
  • 2021-07-10
  • 2021-12-21
相关资源
相似解决方案