由于本人水平极度有限,所以所写的只是个人的想法,不可避免地存在错漏,如果有任何意见或批评,非常欢迎告诉我,请email到pjy.studio@gmail.com
演示代码下载http://pjy.studio.googlepages.com/log_exp_pow.cpp
如果不能正常查看文章,请点击下载文章
最近特然对如何自己写出log()函数十分感兴趣,于是就想探索一下其实现方法。
上次简单的分析了一下pow()函数的实现,在那里只是简单的运用了Taylor展开。鉴于自然对数函数log(),函数exp()和函数pow()有密切的关系,于是就有了一齐把这三个函数的实现方法都写出来的想法。而其中,实现log()函数是最关健和复杂的部分。为了与库函数分开,我自己写的这三个函数名命名为powP,lnP,expP。以下是我的一些想法:
一,运用Taylor展开
要实现lnP,应用Taylor展开是最一般的方法了。这里把lnP(t)转化为lnP(1+x),然后进行展开,由数学分析知识知道在0<t<=2的范围类,其展开式是收敛的,记 。这样就可以粗略计算lnP了,但实现时会发现,用Taylor展开计算的效果并不令人满意,这主要是指其收敛的速度不够快,当t接近0,1,2时,计算时间十分长。这样,我们就需要对 做出变换,以加快其收敛速度,这里,我用了Aitken外推数列的方法。
二,应用Aitken算法加速数列收敛
在实现lnP函数中,加速数列收敛的Aitken方法是整个过程的核心,因此,简单的介绍一下Aitken方法:
计算级数 的和 a ,记级数部分和为 ,如果此数列收敛慢,则有必要构造新数列