上面只是说到整指数,如果指数是小数,情况就复杂多了,
有一种方法是先把小数化成分数
如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! 这个公式化简对程序的加速是明显的,缺点是需要预先根据精度估算出所需的泰勒级数,程序变得复杂,冗余量很大,随着除法速度的提升这个公式的作用已不大了,我程序中最后没有采用了,此处仅供参考。