CS-MEDIUM-02 定点数精确运算
说明
仅设计十进制转二进制,二进制转十进制,为了方便大家操作所以十进制数统一表示为10.1D、10D、0.1D,二进制数统一表示为10.1B、10B、0.1B
课前准备--文件操作
在本次任务中你将实现用定点数实现精确的小数运算。但单独实现精确运算算法时仍然需要手动输入很长的定点数,难免会有不必要的麻烦。但当我们学会文件操作后,直接读取文件中的信息会更加快捷正确。
正好在招新群中有一份二进制和十进制混合的CS_M_02文件来进行练习。
要求
- 将CS_M_02文件中所有二进制数改写为十进制数
- 抓取CS_M_02文件中定点数信息并
提交方式:在markdown文档中提交正确的代码和截图展示运行结果
任务1
了解定点数c语言表示、进制转换函数
定点数,就是小数点位置固定的数,也就是说小数点后面的位数是固定的。定点数如果要表示整数或小数则分为三种情况。若为纯整数,小数点在最后一位,忽略不写。纯小数,小数点固定在最高位。整数小数混合,小数点固定在某个位置。
请用你的编辑器分别书写如下C语言代码并运行
#include <sdtio.h>
int main(){
float a=0.1;
float b=0.2;
float c=a+b;
printf("%f",c);
return 0;
}
#include <sdtio.h>
int main(){
float a=0.1;
float b=0.2;
float c=a+b;
printf("%f",c);
return 0;
}
#include <stdio.h>
int main(){
float a=0.1;
float b=0.2;
float c=a+b;
printf("%.10f",c);
return 0;
}
#include <stdio.h>
int main(){
float a=0.1;
float b=0.2;
float c=a+b;
printf("%.10f",c);
return 0;
}
会发现第二个运行结果为0.3000000119, 所以出现了经典现象0.1+0.2>0.3
任务
- 为什么会出现这样的现象?请阅读相关资料后提交与于arkdown文档。
可以阅读《计算机组成原理》中定点数部分以及《深入了解计算机系统》的第二章。
- 该如何获得精确值呢?请阅读相关资料后提交于markdown文档。
可以了解java中的BigInteger和BigDecimal类,python中的Decimal块和C语言gmp.h头文件;
了解二进制中的移位运算
- 课前热身:请提交代码实现二进制与十进制的相互转化。
任务2
Step1 定点数的表示与存储
正如之前了解过的数据结构,我们知道原生的几种类型由于存储方式的限定导致不能实现更多操作,所以在这里要学会使用PointFixedNum类来进行操作,注意符号位、整数部分、小数部分。
规定整数部分32位小数部分32位。
typedef struct{
//自定义成员列表
}PointFixedNum;
typedef struct{
//自定义成员列表
}PointFixedNum;
提示:
要如何创建PointFixedNum类来更好地满足我们的运算需求呢?
在大数运算中我们是怎么做的呢?
在第一步设置的时候要好好思考哦,因为这关系到后面的每一步~
任务:
- 自定义成员列表以表示定点数
- 了解结构体的内存布局,怎么才能让我们定义的结构体占据最小的内存?
- 编写函数init将输入的数字存储到PointFixedNum中,并输出该数字以验证输入是否正确
- 二进制数要转换成十进制数
样例输入
输入 | 输出 |
---|---|
-34.1D | -34.1D |
11.1B | 3.5D |
-11.1B | -3.5D |
提交方式:在markdown文档中提交正确的可执行的代码和截图展示运行成果
Step 2 实现精确计算
任务:
完成两个定点数之间不丢失精度的加法、减法、乘法
提示:
- 该如何判断溢出呢?或许该有个特殊的计数器?
- 乘法的本质是什么?减法的本质又是什么呢?
输入 | 输出 |
---|---|
5.223456789114514D + 0.8D | 6.023456789114514D |
114.514D - 314.159D | -199.645D |
1.14D * 7.08D | 8.0712D |
思考
- 从计算机中的逻辑运算角度出发,减法如何转化为加法?
- 推荐阅读csapp的第2.3节,可以额外了解二进制下的计算。
提交方式:在markdown文档中提交正确的代码和截图展示运行结果
任务3
运用前文所学,完成CS_M_02中的连续计算,最后结果以十进制表示。
提交方式:在markdown文档中提交正确的代码和截图展示运行结果
本题提交方式
主题示例:2024090101012-张三-CS-05
出题人联系方式
nonburesu
QQ:2809816627