3.1 将0.1累加100次得不到100
理想的结果是整数10,但结果却并不准确
3.2 用二进制数表示小数
将二进制小数1011.0011转换成十进制小数:
3.3 计算机出错的原因
计算机之所以出现错误,是因为有一些十进制的小数无法转换成二进制数,如十进制0.1就无法用二进制数正确表示,小数点后面即使有几百位也正确表示不了
小数点后4位用二进制数表示时的数值范围为0.0000-0.1111,因此只能表示有限的十进制小数
如上图,十进制数0的下一位是0.0625,这中间的小数就无法用小数点后四位数来表示。实际上,十进制数0.1转换成二进制后,会变0.00011001100…(1,0循环)这样的循环小数,计算机无法处理循环小数,只能取近似值。这就是计算机运算小数时出错的原因
3.4 什么是浮点数
像1011.0011这样带小数点的表现形式,完全是纸面上的二进制数,在计算机内部是无法使用的
很多语言提供float和double来表示数据,float占32位,double占32位来表示小数。浮点数是指用符号,尾数,基数,指数这四部分表示的小数。由于计算机内部用二进制处理数据,所以基数都为2
符号部分用1表示负数,0表示正数。数值的大小用尾数部分和指数部分来表示。尾数部分用将小数点前面的值固定为1的正则表达式,而指数部分用的则是EXCESS系统表现
3.5 正则表达式和 EXCESS系统
尾数部分使用正则表达式(按照特定的规则来表示数据的形式),可以将表现形式多种的浮点数统一为一种表现形式。如十进制小数0.75就有多种表现形式。为了方便计算机的处理,需要制定一个统一的规则
将小数点前面的值固定为1的正则表达式处理方法:
指数部分使用EXCESS系统,使用这种方式主要为了表示负数时不使用符号位。EXCESS系统指通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示
3.6 在程序中得到确认
将十进制小数0.75用单精度浮点数分隔表示为
0(符号位)-01111110(指数部分)-10000000000000000000000(尾数部分)
0.75是正数,则符号位为0。指数部分是十进制126,则EXCESS系统表现为-1
根据正则表达式的规定,尾数部分为实际为1.10000000000000000000000这个二进制数。将尾数部分的二进制数转换成十进制数,结果就是1.5(1乘2的0次幂 + 1乘2的-1次幂)
所以结果为1.5*2^-1,刚好是0.75
但对0.1处理时,经过处理后计算
0-01111011-10011001100110011001101的值用十进制表示为1.5*2^-1=0.75这样的结果与0.1相差甚远,这就是计算机处理小数时出现错误的过程
3.7 避免计算机计算出错
计算机出错的原因之一是,采用浮点数来处理小数。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在着出错的可能
避免出错介绍两种方法:
1,回避策略,即无视这些错误。有时一些细小的偏差不会造成什么问题
2,将小数转换成整数计算
3.8 二进制和十六进制数
二进制在以位为单位表示数据时过于冗长,实际程序中常用16进制数来替代二进制数