在第三章我找到了计算机运算出错的原因:“有一些十进制的小数无法转换成二进制”。小数点后面4位二进制数表示时的数值范围为0.0000~0.1111.因此,这里只能表示0.5、0.25、0.125、0.0625这四个二进制数小数电后面的位权组合而成(相加总和)的小数。因为无法正确表示的数值,最后都变成了近似值。

那么计算机遇到循环小数时该怎么办?计算机就会根据变量数据类所对应的长度将数值从中间截断或者四舍五入。例如:0.3333…这样的循环小数从中间截断会变成0.333333,这是它的3倍是无法得出1的(结果是0.999999),计算机运算出错的原因也是同样道理。

两种表示编程语言里面全体小数分别是双精度浮点数类型(64位)和单精度浮点数类型(32位)。在c语言、Java语言、vb6.0中,双精度浮点数类型单精度浮点数类型分别用doublefloat来表示。

浮点数是指用符号、尾数、基数和指数四部分来表示的小数。因为计算机内部使用的是二进制数,所以技术自然就是2。所以只考虑符号、尾数、指数三部分,就可以表示浮点数。

浮点数的内部构造(IEEE电气电子工程师学会的规定)

  1. 双精度浮点数(共64位) 符号部分占1位、指数部分占11位、尾数部分占52位
  2. 单精度浮点数(共32位)

符号部分占1位、指数部分占8位、尾数部分占23位

符号部分是指使用一个数据位来表示数值的符号。该数据位是1时表示负,为0时则表示“正或者0”。尾数部分用的是“将小数点前面的值固定为1 的正则表达式”,而指数部分用的则是“EXCESS系统表现”(EXCESS是“剩余的”意思,例如,把01111111看作是0的话,比这个数小1的01111110就是-1)。

那么问题来了如何避免计算机计算出错

首先,回避策略,即无视这些错误。另外一个策略是把小数转换成整数来计算

这就是第三章的主要内容。