00:00
今天我们来说一下浮点数在计算机中的一些表示问题。我是怎么发现这么个问题,是根据这么个例子来的。我们都知道。真出。返回的是原不大于原本除的最大整数嘛。我们首先来算一下1.0,不要看这个整除,我们就把它当成原本的除。看看结果是多少?1.0除以0.2。口算。也就等于是1.0除以1/5等于1.0乘上五。也就是五。不大于它的最大整数也可以等于它呀,我的结果应该是5.0,可是为什么是4.0?有金人,我怀疑我的这种故意改结果。没有没有没有,请你们看这里。我没改吧?大家可能对于这个结果感觉有些懵。我们不用慌,我们把整除改成求余,来看看结果是多少。
01:06
果不其然。出现了问题。此时此刻可以发现浮点数在计算机中的表示会有误差吗?有两种可能。第一种可能1.06误差,第二种可能0.2有误差。当然,至少有一种可能是正确的,如果全是错的,那么这地方也就不会有误差了。至少有一种可能,就是两种当中有一种对,或者两种可能都是对的。到底哪一种对,我们接着往下看。我们都知道,数据包括浮点数,在计算机中有二进制的形式表示。假设一个高进制数XM一直点点零一直到X1X里。这个点是小数点哦。然后这里是X负一一到X负A,其中XM1直到X1 X0 X负一一直再到X负A。
02:05
只可能是在取值之可能是零和一两个数。MN均为正整数。其对应的十进制数XM乘上二的负二的M次方一直加,加到X1乘上二的一次方,再加X0乘上二的零次方,再加上X负一乘上二的负一次方,一直加到X负A乘上二的负次方。因式分解提取二的负N次方,我们可以得到由二的负N次方乘上XM乘上二的M加N次方,一直加,一直加到X1乘方二的N加一次方,一直再加到X0乘上二的N次方再加X负一乘上二的零减零次方,一直加到X负N次方一不对,没有次方X的负,由此可得一个十进制数,要想精确的表示成二进制数。必须要求该十进制数是二的负N次方的整数倍,这边很明显是一个整数。因为M加N肯定大于零了,然后N减一也是大于零。
03:05
然而因为存在整数二的N次方,满足1.0等于二的次方乘上二的负N次方。所以1.0有误差这个说法是不对的。下面来证明0.2有误差这个说法是正确的。证明林鸟在计算机中的表示会有误差。这个问题,可能有些人会想到所谓的乘积取整法。你们可以发现,无论沉多少次。你永远都不可能成的完。当然,用二进制除法也永远不可能除得尽。你尽管去试你能处境,你算我输。可能有些人会处着处着发现时代懒得处了。就感觉上认为。这种说法。就感觉上认为这这个说法是就感觉认为零点在计算机中有误差,这只是停留在感觉上下面。我来实打实的进行一下证明。
04:01
这里我采用的是反正法,假设1/5,当然也是0.2嘛。等于二的A1次方一直加到二的an次方,其中an小于一直小于A1一直小于到一直小于零,An和一直到A1。均为整数,令BN等于负的an,那么就有1/5等于二的B次方分之一,直加到二的BN次方分之一。然后我们可以去分母吗?两边同乘五乘以二的BN次方,就有二的BN次方等于五乘上。二的BN减B1一直加,加到二的BN减去BN减一,最后再加一,显然矛盾。为什么矛盾?二的B减一次方是一个偶数,根据前面的根据前面的知识可以得出来B点就肯定是大于零的。二的零次方是一个偶数。所以等式的左边是一个偶数,等式的右边五是个奇数。
05:02
二的BN减B1偶数。然后这边点点点大家也知道是什么,一直加二的BN减B2等等等一直加到二的BN减去BN减一。这个是偶数,中间的也全部都是偶数,同时这一项也是偶数,所以这一块是偶数。然后我又加了个一吗。这就变成了一个奇数,所以右边是奇数乘以奇数还是奇数等式,左边是偶数等式,右边是个奇数。这怎么可能不矛盾?所以0.2在计算机中的表示会有误差。当然,由此可以得出以下推论。不允许出现误差的场合,比如表示前不能使用浮点数。当然,并不是所有的十进制浮点数,哪怕位数为限,这里就只有一位小数呀,0.2不是一位小数吗?都可以使用二进制来精确表示的。
我来说两句