高精度乘方二

上面只是说到整指数,如果指数是小数,情况就复杂多了,
有一种方法是先把小数化成分数
如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,底数10 的形式变为1.0000.......yyy,当然结果返回后针对前面的开方要做后期处理。

然后: z=0.0000.......xxx ,a=67.891,再进行泰勒公式计算,值存入string1;

接着: z=0.0000.......yyy ,a=2*67.891,再进行泰勒公式计算,值存入string2;


计算完成后要针对前面的开方作后期处理

 

开方后期处理是:

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

              最终结果=string1*string2
因程序太复杂,源程序也难以理解,网友可以了解了解大致思路,有好的意见请指点。
 上述思路已通过程序实现,证明是正确的。              
上面的泰勒公式也可化简为:(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值