当前位置:C++技术网 > 精选软件 > C++ Primer Plus 6th 3.6 复习题 第7题 变量赋值的舍入误差

C++ Primer Plus 6th 3.6 复习题 第7题 变量赋值的舍入误差

更新时间:2019-02-17 14:56:17浏览次数:1+次

C++ Primer Plus复习题3.6 第七题  变量赋值的舍入误差

题目:
7.将long值赋给float变量会导致舍入误差,将long值赋给double变量呢?将long long值赋给double变量呢?

答案:这个问题的答案取决于这两个类型的长度。如果long为4个字节,则没有损失。因为最大的long值将是20亿,即有10位数。由于double提供了至少13位有效数字,因而不需要进行任何舍入。long long类型可提供19位有效数字,超过了double保证的13位有效数字。

C++技术网辅导详解解答:
    其实此答案说的还是比较清楚了。两个类型的长度即存储这个类型变量需要的字节数,字节数越多,表示长度越长。
    那么什么是舍入误差呢?当长的数值赋值给短的变量的时候,因为短的变量所拥有的字节数没有数值需要的长度大,超出长度的部分无法放到变量所在的内存中,多余的数据去哪了呢?那就是丢失了。这就是所谓的丢失数据(高位丢失和低位丢失)。通常高位丢失可应用于取模操作,而低位丢失则是四舍五入或直接截断等。
    我们这里所说的误差是低位数据丢失,所以数值相差会很小,所以才叫做误差。如果高位丢失,则不是误差。丢失一个亿那不是误差,而丢失1分钱可以是误差。所以我们这里一定说的是低位数据的丢失。
    而舍入误差这里应该表示的是四舍五入的误差。long和long long类型是整型,而float和double是浮点型,一方面在长度方面有差别,另一方面在数据存储格式上也是有差别,进而反应到最终的数据表示范围上也有差别。对于浮点数来讲,2.0实际存储的值可能是1.999999也可能是2.000001。本身浮点数存储的数据和整数2是不一样的,当存在整数赋值给浮点数的时候,就会有精度上的差异,存储格式上的变化。
    所以综上,导致舍入误差的原因,有数据表示的长度差异产生,另一个还会由于存储格式的差异。