“长”精度实数的“加法、减法、乘法、除法”全用整数数组保存,按照整数的运算规则处理,此其一
其二,涉及到sin这样的函数,采用级数解决,常用的有:
sin(x) = x - x^3/3! + x^5/5! - .....
= ∑ (-1)^k*{ [x^(2k+1)]/[(2k+1)!]}
cos(x) = 1 - x^2/2! + x^4/4! - ....
exp(x) = 1 + x^1/1! + x^2/2! + x^3/3! + ....
= ∑[(x^k)/(k!)]
如果要计算到小数点猴1000位,即要求余数项小于10^(-1000),考察上述级数,满足此条件的k值可以这样计算
n! = 1*2*3*4*5*....*n 有个著名的估计算法,忘记了,你可以找一下《数学手册》上面有。
这样 取 x = π/2 那么,最后一项的确定 k 值就可以了
------------------------------------------------
n! de Moiver 近似公式(Stirling逼近)
n! ≈ (n/e)^n*√(2πn) ..... (n/e)^n .....其中e为自然对数的底。
-------------------------------------------------
y = a^x 其中x是小数,那么采用对数计算
ln(y) = x*ln(a),转换成求a的对数问题
经过适当的线性处理,a 可以表达成 a = k*(1+d)形式,对于小于 1 的情况,k取小数,其中 d 小于 1
那么原式变换为
ln(y) = x*[ ln(k) + ln(1+d)]
此式采用级数展开:
ln(1 + d) = d - d^2/2 + d^3/3 - d^4/4 + ......
现在可以了吧,估计一下收敛速度:
取d = 1 则有:
1/(n-1) - 1/n < 10^(-1000)
1/[(n-1)*n] < 10^(-1000)
哇....n 大约是10^500 ....收敛得太慢了....
看来你要自己找更快的级数了