lab1 2021.9.23

使用参考书为学校配套使用上机指导书

一、收零钱 p13

本题中主要问题为第三小问,为什么charge的输出值为1.79…98。

这涉及到 **浮点数在计算机中的存储结构 **,在计算机中浮点数一般不能被精确表示而只是逼近。这是因为计算机中只能存储0和1,而double型的浮点数占据存储单元中的64位,也就是说计算机表示的所有double型浮点数都是由64个0或1来表示的。

那这些0、1怎么表示出近乎实数域的浮点数范围呢?这是由IEEE754标准决定的,如下所示,有兴趣的同学可以了解阅读这个标准计算机是怎么用64个0、1(也就是有264种组合可能,可以说足够多了)来编码近乎所有的浮点数的。

1-2

这题中还涉及到一点,就是在程序中怎么 改变显示位数 。可以在书上给出的代码中看到我们使用了setprecision进行设置。

cout << setprecision(17) << charge << endl;

注意使用setprecision前需要先include<iomanip>iomanip库的作用主要是对输入输出的格式进行设置。

二、温度转换 p15

此题代码的错误原因是,’5’和’9’都是int型数据,所以’5/9’进行的是整型运算,这样会出现’5/9==0’的结果,而c++的运算式是从左到右进行的,这导致式子后面的值都没用(因为都是乘以前面的0)。

改正的方法就是将整型运算变为浮点型运算(不论用什么方式)。最普遍也最简单的方法是将’5’改写为’5.0’,这会让编译器将’5.0/9’认为是浮点型间的运算。因为当不同类型的数值进行运算时,会统一将数据类型转换为最高级的数据类型,这里就是将’9’提升为’9.0’。(换言之,只要计算中出现浮点型数,那进行的就是浮点运算,会将整型数自动提升为浮点型)

注意在以后的编程中, 都需要检查可能的浮点(分数、小数)运算 ,在最左边就使用浮点数,保证运算是浮点运算,防止出现同样的问题。