高精度对数函数的实现二
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!的位长,大多少?公式开始提速?要通过测试确定,当然是越大越好。
第二个提速原理就是尽量把除不尽的除法换算成能整除的除法。
转换成: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!的位长,大多少?公式开始提速?要通过测试确定,当然是越大越好。
第二个提速原理就是尽量把除不尽的除法换算成能整除的除法。
相关文章推荐
- Android在xml中设置点击事件不响应
- 第13周实践项目2动物这样叫(2)
- 第十三周项目1.4—分数类中的运算符重载
- 打飞机
- mybatis 动态sql详解
- Spring 整合 Redis
- 数据结构实验之栈:行编辑器
- Android--Bundle类
- 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)
- 聚类算法实践(一)——层次聚类、K-means聚类
- C语言程序设计感想
- 51 NOD 1189 阶乘分数(素因子分解+推公式+求逆元)
- opencv入门建议和资源推荐
- C++第六次作业
- bzoj1901 Zju2112 Dynamic Rankings
- 菜鸟学Java之错将for循环大写
- 第12周项目1-实现复数类中的运算符重载(2)使用友缘函数
- 2016.5.25(1)0/1背包问题
- Android Home按键的监听与屏蔽方式
- Bean property 'productService' is not writable or has an invalid setter method. Does the parameter t