2.4牧牛杖不见了:请教数学&编程高手:关于任意精度长度运算的思路,小数乘方,函数

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 17:08:27
我正在编写一个任意精度长度运算的程序
已经弄好了结构、加法、减法、乘法、除法、整数乘方
现在的问题是小数乘方怎么算,还有一些函数,比如Sin等,怎么计算,要任意精度的
比如:
12.23^2.577=?
Sin(1.157467477)=?
要求1000位精度,用程序来实现?谢谢
蛙语蝉鸣的sin解答还可以,但关于小数乘方不详细,小数乘方实际就是开方啊

“长”精度实数的“加法、减法、乘法、除法”全用整数数组保存,按照整数的运算规则处理,此其一

其二,涉及到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 ....收敛得太慢了....

看来你要自己找更快的级数了