我在《程序是怎样跑起来的》第三章主要学到了计算机进行小数运算时出错的原因。
计算机内部所有的信息都是以二进制数的形式来处理的,在这一点上整数和小数没有区别。将1011.0011这个有小数的二进制数转换成十进制数,如图
了解将二进制数表示的小数转换成十进制数,那计算机运算出错的原因就容易理解了。计算机之所以出现运算错误,是因为“有一些十进制的小数无法转换成二进制数”。在图3-2中,小数点后4位用二进制数表示时的数值范围为0.0000~0.1111。因此,这里只能表示0.5、0.25、0.125、0..625这四个二进制数小数点后面的位权组合而成的小数。将这些数值组合后能过表示的数值,即表3-1中所示的无序的十进制数
实际上,十进制数0.1转换成二进制后,会变成0.00011001100…这样的循环小数。计算机这个功能有限的设备,是无法处理无限循环的小数。因此无法正确表示的数值,最后都变成了近似值。计算机运算就会出错。
采用浮点数来处理小数是计算机出错的原因之一。如何避免计算机计算错误呢?
回避策略,既无视这些错误。根据程序目的的不同,有时一些微小的偏差并不会造成什么问题。另一策略是把小数转换成整数来计算。计算机进行小数计算时可能会出错,当进行整数运算时一定不会出错。