高精度乘方二

2021-07-13 15:39:16 字數 1208 閱讀 9665

上面只是說到整指數,如果指數是小數,情況就複雜多了,

有一種方法是先把小數化成分數

如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.......***,底數10 的形式變為1.0000.......yyy,當然結果返回後針對前面的開方要做後期處理。

然後: z=0.0000.......*** ,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!     這個公式化簡對程式的加速是明顯的,缺點是需要預先根據精度估算出所需的泰勒級數,程式變得複雜,冗餘量很大,隨著除法速度的提公升這個公式的作用已不大了,我程式中最後沒有採用了,此處僅供參考。         

高精度除法(高精度除以高精度)

先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...

高精度計算 二 高精度的加法運算

例 高精度加法運算 輸入正整數 a 和 b,輸出 a b 的值。0 輸入 第一行 a 第二行 b 輸出 a b 的和。樣例輸入 99 999樣例輸出 1098 分析 1 加法運算 a 7 a 6 a 5 a 4 a 3 a 2 a 1 0 0 b 5 b 4 b 3 b 2 b 1 c 7 c 6 ...

高精度計算 二 高精度的加法運算

例 高精度加法運算 輸入正整數 a 和 b,輸出 a b 的值。0 輸入 第一行 a 第二行 b 輸出 a b 的和。樣例輸入 99 999樣例輸出 1098 分析 1 加法運算 a 7 a 6 a 5 a 4 a 3 a 2 a 1 0 0 b 5 b 4 b 3 b 2 b 1 c 7 c 6 ...