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 ...
随机推荐
- VIM入门
目录 一.vim介绍 二.vim颜色显示和移动光标 三.vim一般模式下移动光标 四.vim一般模式下复制.剪切和粘贴 五.进入编辑模式 六.vim命令模式 七.vim实践 一.vim介绍 vi是最重 ...
- web 页面上纯js实现按钮倒计数功能(实时计时器也可以)
需求构思:本功能想实现的是,一个按钮在页面载入就显示提醒续费,,,倒数60秒后,完成提醒功能,可以按另外一个页面跳转到主页. 参考网上的大神,实现如下:Button2倒数,Button3跳转,在页面上 ...
- L2-016. 愿天下有情人都是失散多年的兄妹(深搜)*
L2-016. 愿天下有情人都是失散多年的兄妹 参考博客 #include<iostream> #include<cstdio> #include<cstring> ...
- [转]Haproxy原理(1)
本文出处:https://www.cnblogs.com/skyflask/p/6970151.html 目录 一.四层和七层负载均衡的区别二.HAProxy与LVS的异同三.快速安装HAProxy集 ...
- 深入理解Java中停止线程
一.停止线程会带来什么? 对于单线程中,停止单线程就是直接使用关键字return或者break,但是在停止多线程时是让线程在完成任务前去开启另外一条线程,必须放弃当前任务,而这个过程是不可预测,所以必 ...
- 购物车存到cookie
为什么不存session? 首先,session存在时间限制,会定期清空的,而cookie如果不主动清或者设置定期则不会清楚: session存放在服务器端,cookie存放在客户端浏览器. 购物车存 ...
- Python全栈之路----函数进阶----闭包
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们之外被调用时,就会形成闭 ...
- SUID、SGID、粘滞位
粘滞位(Stikybit) +t,只有用户自己可以删除自己创建文件,其他用户只能查看,不能删除. 1:创建两个用户 useradd oo ...
- nginx里proxy_pass有无/的区别
nginx在反向代理的时候,proxy_pass需要指定路径,有无"/"的区别,如下: location /lile { 配置一: proxy_pass http://192. ...
- iOS兼容性(不断完善)
1.iOs不支持iframe,不支持flash,如果移动端要嵌入视频,请用html5 的video标签.