您的位置:首页 > 其它

高精度对数函数的实现二

2016-05-25 21:05 190 查看
针对泰勒展开式:ln(1+x)=x-x^2/2+x^3/3-……+(-1)^(k-1)*(x^k)/k(|x|

转换成:ln(1+x)=x(1-x(1/2-x(1/3-x(1/4-x(1/5..........)))))

这样转换并没有提高效率,但可以预算1/2 1/3 1/4 1/5.....针对一万精度,因为经过了开方优化,这里只需要10000\70=133次泰勒级数运算,所以可以预制133个万位长数的表格供调用,

粗略估计可以获得一秒的速度提升。

还可转换成:ln(1+x)=(x(N!-x(N!/2-x(N!/3-x(N!/4-x(N!/5..........)))))
)/N! N是你需要运算的泰勒级数

这个转换不仅不能提高效率,在我的程序万位运算中,速度还有所下降。

但它还是有用的:

现在计算十万精度的ln(9),1-100000的倒数绝大多数都是无理数,我的意思就是除不断,为了获得十万精度,这些倒数你需要计算或预制十万位,100000\70=1428,这里需要1428次泰勒级数运算,

1428!的位长是3886,1428!除以(1-100000)中的任何数都能除断(整除),都只需要3886位(多精对单精)除法运算(当然这里需要除法子程序有判断除法除尽的功能),这样,1428个十万位除法就变成了(1428个3886位(多精对单精)除法,再加上一个十万除以十万的(多精对多精)除法), 为什么在我程序是没有效果是因为我的精度要求过低造成了泰勒级数运算过少。说明一下:1\99999取十万位,虽然1只有一位,但还是要经过十万位运算,1需要扩展到十万位才能进行除法运算。

专门针对ln(1+x)=x(1-x(1/2-x(1/3-x(1/4-x(1/5..........)))))
进行了测试

ln(9),精度十万,泰勒级数1428,用时1322秒

针对ln(1+x)=(x(N!-x(N!/2-x(N!/3-x(N!/4-x(N!/5..........))))) )/N! 进行了测试

ln(9),精度十万,泰勒级数1428,用时28秒,提速47倍

精度十万,1/99999,用时820ms,

精度十万,1428!/99999,用时15ms,除法的提速和总程序的提速大致吻合。

针对我经常讲的精度控制,可能很多人不理解,如果要进行算式运算或综合运算,没有精度控制,整个程序就和没有监督的权力一样,是不健全的....,错误多多,

我早期的程序就没有精度控制,结果在实现三角函数和开N次方函数时,一直不成功。

N!就是1-N的公倍数,所以能整除,1-N的最少公倍数是多少?用最小公倍数代替N!效果会更好

这个公式的提速原理是精度大于N!的位长,大多少?公式开始提速?要通过测试确定,当然是越大越好。

第二个提速原理就是尽量把除不尽的除法换算成能整除的除法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: