《程序是怎样跑起来的》第三章

本章讲的是计算机在计算小数时会出错的原因。首先我们先学习如何把二进制转换为十进制,整数部分的转换方法上一章已经介绍过了,只要将各位数字乘以对应的位权(位权是指各位数字所表示的单位值),然后将结果全部加起来就可以了。那么,小数部分应该如何转换呢?其实就和整数一样,将各位数字乘以对应的位权后相加即可。
计算机计算出错的原因是有一些十进制小数无法转换为二进制数。二进制数是连续的,但十进制数是不连续的。虽然我们可以通过增加二进制小数的位数来增加与之对应的十进制数的个数,但无论增加多少个小数,都无法通过让2的负XX次幂相加来凑出0.1。实际上,将十进制数0.1转换成二进制数会得到0.00011001100…(之后1100不断重复)这样一个循环小数。无法准确表示的值就只能使用近似值来表示,计算机能力有限,无法处理无限的循环小数,只能根据变量所对应的数据类型的比特数对数值进行截断,或者采取四舍五入的处理。很多编程语言都提供了两种,能表示小数点的数据类型,双精度浮点型和单精度浮点型,双精度浮点型的长度有64位,单精度浮点型的长度有32位。浮点数将小数分为符号、尾数、基数和质数四个部分来表示,由于计算机内部使用二进制基数一定是2,所以实际的数据中不包括基数,只用符号、尾数和指数三部分来表示浮点数。在实际数据中,这三部分会共同占用64位或32位的长度。
尾数部分使用的规格化表示法,其作用是将表示形式不一致的浮点数,用统一的形式来表示,由于十进制小数可以用任意一种方式来表示,但同一数值有多种表示方法对计算机来说不好处理,因此必须统一。对十进制浮点数来说,我们可以规定整数部分必须为0,小数部分第一位不能为0。二进制中思路和十进制中的一样,只不过二进制中使用的整数部分固定为1的规格化表示法。移码表示法,就是将指数部分表示范围的中间值规定为0,从而可以在不使用符号位的情况下表示负数。
那么我们现在来说,如何避免计算机计算出错?第一种是回避策略,也就是忽略错误,根据程序的用途,有时候计算结果的微小误差并不会产生实际的问题。第二种方法是用整数的来代替小数进行计算,计算小数时可能会出错,但在计算机计算整数时只要不会超过规定的数值范围,完全不会出错。因此,我们可以在计算时临时使用整数,然后将计算结果用小数来表示。

posted @ 2024-02-27 13:32  小靖没烦恼  阅读(16)  评论(0)    收藏  举报