高精度乘方二

来源:互联网 发布:支付宝 api端口号 编辑:程序博客网 时间:2024/05/21 10:44
上面只是说到整指数,如果指数是小数,情况就复杂多了,
有一种方法是先把小数化成分数
如2的1.2次方就等于2的5分之6次方,等价于2的6次方,再开5次方,yroot(5,2^6)  =2.2973967099940700135972538935559
这个方法缺点很大,如2^0.1111111111111111等于2的10000000000000000次方,然后再开1111111111111111次方
这么大的乘方,开方,效率低下,而且难以实现,没有这么大的高精开N次方程序,
不过有了这个公式 :(1+z)^α=1+αz+α(α-1)z^2/2!+α(α-1)(α-2)z^3/3!+…+ [α(α-1)…(α-n+1)]z^n/n!+…,|z|<1
这个公式有一个难点,底数的大小要接近1。
我的方法如下:例:123.45^67.891
123.45^67.891可分为(1.2345^67.891)*(10^2)^67.891=(1.2345^67.891)*(10)^(2*67.891)
对1.2345,和10分别开2^80次方,此时底数x 的形式变为1.0000.......xxx,当然结果返回后针对前面的开方要做后期处理。
对指数处理:67.891=67+0.891,指数67可以用前面的整指数乘方程序算,
然后把分解后的x 和a(这里是0.891)代入泰勒公式计算,
计算完成后要针对前面的开方作后期处理

开方后期处理是:

              string1 = myCf(string1, 2^80),    myCf是整数乘方函数

因程序太复杂,源程序也难以理解,网友可以了解了解大致思路,有好的意见请指点。
 上述思路已通过程序实现,证明是正确的。              
上面的泰勒公式化简为:(1+x)^a= 1+ ax*(2*3*4*5+ (a-1)*x*(3*4*5 + (a-2)*x*(4*5+(a-3 )*x*(5+(a-4)*x....))))/n!     这个公式化简对程序的加速是明显的,在我的前面贴子里已有介绍             
0 0
原创粉丝点击