半小时是多长时间?
问这个问题的,估计都是学生吧,让我想到大学物理刚入门的时候,老师给我们打比方,1分钟等于60秒(注意这里是秒不是分),1平方米钢的体积比1立方米铁的体积小(注意这里讲的是体积而非密度)…… 这些简单的换算关系,在数学里面叫做“自然对数”或者“底数为e的对数”。
以自然对数的底e来度量时间、空间等量,是非常合理的。因为自然界很多量都是以e为基础的。 e是一个无限不循环无理数。也就是说,不可能用有限个整数来表示e。 所以,任何以e为基础的算法,必然出现无穷多个迭代,比如开方。所以,计算机如果要精确计算某个数值,最终结果必然是无穷无尽的重复。这就会让人产生一种错觉,计算机一直在停止运行,根本没有动过。这种算法的效率其实是很低的。 后来人们发现,在一些情况下,可以用更实用的近似方式来换取计算上的方便。
比如,上面提到的开根号的问题,如果只要求精度到小数点后20位,那么只需要把根号内的数字乘8,然后把小数点向右移动7位就够了。
这是基于如下事实:当且仅当被开方的数是2n时,其根号的前n项之和才接近于被开方数本身。而当被开方数非2n时,根号的前n项几乎总是小于被开方数的。这时,用一个接近的被开方数的整数次幂来代替根号,损失的部分只有很小一部分。 这是一种近似,但代价是把精确度降低到仅仅足够判断两个数字是否相等。这种算法被称为“舍入算法”。现代计算机都是建立在舍入算法的基础之上的。 如果不采用舍入算法,而是试图直接通过无穷无数个迭代把答案计算出来,那将是不可能的。