首先计算机计算也是会出现错误的,比如0.1累加100次应该为10,但若用计算机运算却得出的结果为10.000002,如图所示:
但为什么会出现错误计算呢?这是因为有一些十进制的小数无法转换成二进制数。或许先了解如何用二进制数表示小数更容易明白为什么无法转换。首先对于正数第二章已经介绍过在计算机内部如何用二进制表示,但小数呢?比如1011.0011如何转换成十进制数呢?整数的转换第二章就说明过了,因此这里自然着重说小数点后面的怎样转换,其实计算方法与整数是一样的,只不过变成了2的负几次幂。例如小数点后第一位就是0×2负1次幂,以此类推.0011换算成十进制数就是0.125+0.0625=0.1875。所以整个转换结果就是11+0.1875=11.1875。如图所示:
现在知道了如何转换,那么现在讨论为什么无法表示就更加明显。首先0.1其实是无法用二进制数表示的,有下面一张图就明白为何:(二进制数是连续的,十进制数是非连续的) 在0.0000~0.1111期间转换是没办法正确表示0.1的,因为转换成十进制数0的下面是0.0625,紧接着就是0.125,根本没有0.1,若用二进制数表示0.1就是一个循环数,就像十进制中无法用小数完全表示三分之一一样,因此在遇到十进制中的循环小数也是无法用二进制数完全表示的,这样就是计算机有计算错误的原因。那么应该怎样正确表示小数呢?其实可以用浮点数来表示,浮点数的构成是符号、尾数、基数、指数(二进制中基数为2不需再考虑),其中有两种类型:双精度浮点数,在C语言中用double表示,精度为64位。单精度浮点数在C语言中用float表示,精度为32位。他们两个都会被分为3部分,符号部分、指数部分和尾数部分,其中当属尾数部分所占数据最多,如图所示:
符号部分是指使用一个数据位来表示数值的符号两者都是一位数,一般是1或0,为1时表示负,0时表示“正或0”。而数值的大小都是由尾数部分和指数部分表示,而这里小数就是用“尾数部分×2的指数部分次幂”。 但尾数部分用的是“正则表达式”,指数部分用的是“EXCESS系统表现的”。 那么什么时正则表达式呢?就是将表现形式多样的浮点统一为一种表现形式,例如十进制中小数点前面是0,小数点后面第一位不能是0的规则表示的小数就是正则表达式。而二进制就是将小数点前的数固定为1的正则表达式,下图是二进制数成为正则表达式的过程:
“EXCESS系统表示”是将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示。 最后本章最终应该解释的是如何避免计算机计算错误这个问题:1、无视这个问题。 2、将小数转换成整数来计算。但对于不允许出现误差的情况下,要用第二种方法或BCD方法(用四位数来表示0~9的1位数的处理方法)。
标签:表示,0.1,运算,二进制,尾数,出错,十进制,小数 From: https://www.cnblogs.com/G-y-l-123/p/18015556