
二、用二进制数表示小数
先来一个热身,把1011.0011这个有小数点的二进制数转换成十进制数(前面章节已经讲过了用二进制来表示整数的方法,其实小数也同样),以下图所示:正则表达式

三、计算机运算出错的缘由
经过第2节的学习,你们应该也能大概知道计算机运算出错的缘由了:是由于“有一些十进制数的小数没法转换成二进制数”。例如十进制数0.1,就没法用二进制数正确表示,小数点后面即便有几百位也没法表示。编程
咱们就看小数点后4位用二进制数表示时的数值范围0.0000~0.1111,以下图所示:

这里只能表示0.5 、 0.25 、 0.125 、0.0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。再回到咱们要表示的0.1,怎么加都没法加到0.1的,只会变成0.00011001100...(1100的循环),不信你能够去试试。编程语言
说到这里,你们应该都能明白为何将0.1累加100次也得不到10的缘由了把,由于没法正确表示的数值,最后都变成了近似值。计算机是一个功能有限的机器设备,是没法处理无限循环的小数的,通常计算机都会从中间截断。学习
四、什么是浮点数
像1011.0011这样带小数点的表现形式,彻底是纸面上的二进制数表现形式,在计算机内部是没法使用的。这一章节主要是说明计算机是以什么样的表现形式来处理小数。不少编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数与单精度浮点数。双精度浮点数类型用64位、单精度浮点数用32位来表示全体小数。从C语言中,双精度浮点数类型和单精度浮点数类型分别用double和float来表示。3d
浮点数是指符号、尾数、基数和指数这四个部分来表示的小数,以下图:blog

由于计算机内部使用的是二进制,因此基数天然就是2.所以,实际的数据中每每不考虑基数,只用符号、尾数、指数这三部分便可表示浮点数。也就是说,64位(双精度浮点数)和32位(单精度浮点数)的数据,会被分为三部分来使用,以下图展现:循环

① 符号部分:是指使用一个数据位来表示数值的符号。该数据位是1时表示负,为0时则表示“正或者0”。
② 尾数部分:数值大小的决定部分之一(另一个是指数部分)。尾数部分用的是“将小数点前面的值固定为1的正则表达式”。
③ 指数部分:用的则是EXCESS系统表现。
五、正则表达式和EXCESS系统
① 尾数部分使用正则表达式,能够将表现形式多样的浮点数统一为一种表现形式。例如十进制的0.75就有不少种表现形式:数据类型
正由于表现形式太多,计算机处理时就会比较麻烦。所以,为了方便计算机处理,须要制定一个统一的规则。例如,十进制数的浮点数应该遵循“小数点前面是0,小数点后面第1位不能是0”这样的规则。根据这个规则,0.75就是“0.75 * 10的0次幂”,也就是说,只能用尾数部分是0.7五、指数部分是0这个方法来表示。根据这个规则来表示小数的方式,就是正则表达式。
二进制数也是一样的道理,在二进制数中,咱们使用的是“将小数点前面的值固定为1的正则表达式”。具体来说,就是将二进制数表示的小数左移或右移(这里是逻辑移位。由于符号位是独立的)数次后,正数部分的第1位变为1,第2位以后都变为0(这样是为了消除第2位以上的数位)。并且,第1位的1在实际的数据中不保存。因为第1位必须是1,所以,省略该部分后就节省了一个数据位,从而也就能够表示更多的数据范围。
下图是单精度浮点数的正则表达式的具体例子(单精度浮点数中,尾数部分是23位):

六、在实际的程序中进行确认
对EXCESS系统与正则表达式了解了吗,若是尚未了解,就返回上一小节再看一看,我也是看了几遍才看懂的,若是看懂了,就往下看,用C语言程序来确认单精度浮点数表示方法。二进制
七、如何避免计算机计算出错
计算机计算出错的缘由之一是采用浮点数来处理小数(另外,也有因“位溢出”而形成计算错误的状况)。做为程序的数据类型,不论是使用单精度浮点数仍是双精度浮点数,都存在计算出错的可能性。接下来会介绍两种避免该问题的方法。
① 回避策略,即无视这个错误,只要获得近似值就能够了,那些微小的偏差彻底能够忽略掉。
② 把小数转换成正数来计算。
八、二进制数和十六进制数
最后补充说明一下二进制数和十六进制数的关系。在实际程序中,若是二进制位数太多,看起来会比较麻烦,所以,在实际程序中,也常常会用十六进制数来代替二进制数。二进制数的4位,正好至关于十六进制数的1位。例如,32位二进制数00111101110011001100110011001101用十六进制数来表示的话,就是3DCCCCCD这个8位数。因而可知,经过使用十六进制数,二进制数的位数可以缩短至原来的1/4 。
用十六进制数来表示二进制小数时,小数点后的二进制数的4位一样至关于十六进制的1位。不够4位时用0填补二进制数的低位便可。例如,1011.011的低位补0后为1011.0110,这时就能够表示为十六进制数B.6 。