2018-2019-1 20165205 ch02 课下作业
ch02 课下作业
2.96
代码
#include <stdio.h>
#include <stdlib.h>
typedef unsigned float_bits;
float u2f(unsigned x){
return *((float*)&x);
}
int float_f2i(float_bits f){
unsigned sign = f>>31;
int exp = (f>>23) & 0xFF;
int frac = (f&0x7FFFFF) | (1<<23);
exp -= 127;
if(exp < 0) return 0;
if(exp >= 31) return 0x80000000; //绝对值不大于2^31(1<<31)
if(exp > 23) frac <<= (exp - 23);
else frac >>= (23 - exp);
return sign? -frac : frac;
}
void main(){
int x = 0;
do{
int m = float_f2i(x);
int n = (int)u2f(x);
if(m != n){
printf("error in %x: %d %d\n", x, m, n);
return;
}
x++;
}while(x!=0);
printf("Test OK\n");
}
- 利用循环做测试,但这个循环耗时很久
测试结果:

2.97
代码
#include <stdio.h>
#include <stdlib.h>
typedef unsigned float_bits;
unsigned f2u(float f){
return *((unsigned*)&f);
}
int is_float_equal(float_bits f1, float f2){
return f2u(f2) == f1;
}
float_bits float_i2f(int i)
{
if(i == 0) return 0;
unsigned x = i>0?i:-i;
int sign = i>0?0:1;
int w = sizeof(int)<<3;
int j;
for(j=w-1; j>=0; j--){ //找到最高位
if( (x>>j) & 1) break;
}
unsigned bias = 127;
unsigned exp, frac;
exp = bias + j;
if(j <= 23) frac = x<<(23-j);
else {
frac = x>>(j-23);
unsigned mask = (1<<(j-23)) - 1;
if( (x&mask) > (1<<(j-24)) ) frac++; //需要舍入 到大值
else if( (x&mask) == 1<<(j-24) && (frac&1)) frac++; //舍入到偶数
if(frac == (1<<24)) exp++; //舍入到偶数超过 (1<<24) - 1,指数需要再加1
}
return sign<<31 | exp<<23 | frac&0x7FFFFF;
}
void main(){
int x = 0;
do{
float_bits fb = float_i2f(x);
float ff = (float)x;
if(!is_float_equal(fb, ff)){
printf("error in %d: %x %x\n", x, fb, f2u (ff));
return;
}
x++;
}while(x!=0);
printf("Test OK\n");
}
测试结果:

小结:本次作业我刚开始看到并不会做,然后开始上网查,开始是直接查到了代码,然后发现我其实是看不懂别人写的代码的,比如将x左移31位,又比如和0xFF按为与去获得前八位等,这些我都慢慢尝试去看懂,当然最后也得到了自己想要的结果,包括这个作者的测试方法,直接用整数x,自增之后移位的方法,也让我受益颇多。
2018-2019-1 20165205 ch02 课下作业的更多相关文章
- 20165302 ch02 课下作业
20165302 ch02 课下作业 作业内容 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的测试 发一篇相关内容的博客, ...
- 20155212 ch02 课下作业
20155212 ch02 课下作业 T1 题目 参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端 相关知识 小端法:最低有效字节在最前面 ...
- 2018-2019-1 20165330 《信息安全系统设计基础》第六周课上测试ch02&课下作业
课上测试 测试-3-ch02 任务详情 编写一个程序 "week0203学号.c",运行下面代码: 1 short int v = -学号后四位 2 unsigned short ...
- 20165311 ch02 课下作业
补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的
- ch02 课下作业
2.96遵循位级浮点编码规则,实现具有如下原型的函数: /* *Compute (int) f. *If conversion causes overflow or f is NaN, return ...
- 20155331 ch02 课下作业
2.96 遵循位级浮点编码规则,实现具有如下原型的函数: /* *Compute (int)f. *If conversion cause overflow or f is NaN, return 0 ...
- 20155338 ch02 ch03课下作业
20155338 ch02 ch03课下作业 要求: 1.补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 课上测试-3-ch02 1.编写一个程序 "week060 ...
- 数据库MySQL(课下作业,必做)
数据库MySQL(课下作业,必做) 题目要求: 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入 ...
- 20175221 MyCP(课下作业,必做)
MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...
随机推荐
- python中字符串格式化
username='小黑'age=18high=1.88s2='欢迎%s,年龄是%d,身高是%.2f'%(username,age,high)#%s是通用的,%d就必须传整数,%f就必须是小数,想保留 ...
- 第三视角Beta答辩总结
第三视角Beta答辩总结 博客链接以及团队信息 组长博客链接 成员信息(按拼音排序) 姓名 学号 备注 张扬 031602345 组长 陈加伟 031602204 郭俊彦 031602213 洪泽波 ...
- 50个常用的Linux命令(二)sed
[root@localhost cee]# echo this thisthisthis |sed 's/this/THIS/g'THIS THISTHISTHIS[root@localhost ce ...
- 2. Net、ASP.Net、C#、VisualStudio之间的关系
.Net一般指的是.NetFramework 是一个开发和运行环境,是框架, 提供了基础的.Net类.这些类可以被任何一种.Net编程语言调用,.NetFramework还提供了CLR,JIT,GC等 ...
- Jsの练习-数组常用方法 -slice()
slice() 返回从原数组指定开始下标到结束下标之间的项组成的新数组. slice()方法可以接收一个或两个参数,即要返回项的起始和结束位置. 在只有一个参数的情况下,slice()方法返回从该参数 ...
- 前端修炼の道 | <div> 标签简介
<div> 标签是最基本的,同时也是最常用的标签. 该标签是一个双标签,出现在主体区域中,主要作为一个容器标签来使用,在 <div> 标签中可以包含除 <body> ...
- Delphi 10.3.1 Secure File Sharing解决应用间文件共享
Delphi 10.3.1 为Android项目提供了Secure File Sharing选择项,默认是False.这一项是设置什么呢? 原来,Android 7及以后的版本,为了加强OS的安全性, ...
- 【软件安装】nvidia驱动安装事宜
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html https://docs.nvidia.com/cuda/arch ...
- Geoserver 发布shp格式地图服务
本文实践参考https://blog.csdn.net/zj3172172173/article/details/53336704 第一步: 安装geoserver . 自己去官方下载一个安装包 第二 ...
- python中time模块常用功能
import time time模块提供了大量对时间进行处理的方法 time.time() # 获取当前时间戳,得到自1970年开始的秒数 >>>time.time() 155487 ...