以sin()函数为例谈谈我的两种实现:泰勒公式是
x2 = x*x 'x*x
temp1 = x 'x
n1=2
n2=3
jc=1
sum=x
fhbz = 0 '作为判断加减操作的标志
Do
temp1 = x2*temp1 'x^3, x^5...这里借用了上一次的运算结果,避免重复运算
jc =jc*n1*n2 '1*2*3, 4*5 这里借用了上一次的运算结果,避免重复运算
temp3 = temp1/ jc 'x^3/3!, x^(2n+1)/(2n+1)!
If fhbz = 0 Then
sum = sum- temp3 'x-x^3/3!
fhbz = 1
Else
sum = sum+temp3 'x + x^5/5!
fhbz = 0
End If
n1 = n1 + 2
n2 = n2 + 2
Loop Until n2 = jd Or n1 = jd
因为速度太慢,又改进了一下
X2 = x*x
xjc = jd!
n12 = 1
n1=jd
n2=jd-1
xx = X2
For i = jd To 5 Step -2 'jd是精度控制参数
n12 = n1* n2*n12
n1 = n1 - 2
n2 = n2 - 2
xx = n12-xx
xx = X2* xx
Next
xx = x * xx
xx = xx / xjc
sum = x - xx
第二种方法用的高精加,减,乘(万进制硬乘配千进制FFT乘),除(估商配迭代除法)是我自已写的,万位精度sinx在32位机上用时100秒左右,
网上有个(BTCAL疯狂计算器v2.5,里面很多运算非常强大)万位精度sinx在我的电脑上用时22秒,不过它的高精乘法速度是我的乘法的十倍,也就是说它的三角函数算法速度可能和我的差不多。
sinx= x- x^3/3! + x^5/5! - x^7/7!+ x^9/9! .... =∑(-1)^n x^(2n+1)/(2n+1)!第一种是在硬算的基础上简单优化:下面是流程码
x2 = x*x 'x*x
temp1 = x 'x
n1=2
n2=3
jc=1
sum=x
fhbz = 0 '作为判断加减操作的标志
Do
temp1 = x2*temp1 'x^3, x^5...这里借用了上一次的运算结果,避免重复运算
jc =jc*n1*n2 '1*2*3, 4*5 这里借用了上一次的运算结果,避免重复运算
temp3 = temp1/ jc 'x^3/3!, x^(2n+1)/(2n+1)!
If fhbz = 0 Then
sum = sum- temp3 'x-x^3/3!
fhbz = 1
Else
sum = sum+temp3 'x + x^5/5!
fhbz = 0
End If
n1 = n1 + 2
n2 = n2 + 2
Loop Until n2 = jd Or n1 = jd
因为速度太慢,又改进了一下
化成 sinx=x−x⋅x2(4⋅5⋅6⋅7⋅8⋅9−x2(6⋅7⋅8⋅9−x2(8⋅9−x2)))/9! 这个式子不标准,但是更好理解 ,速度在第一个方法的基础上提高了十倍,当泰勒级数较多时,可以近似理解为消去了除法,所以速度获得了较大提升
流程如下:X2 = x*x
xjc = jd!
n12 = 1
n1=jd
n2=jd-1
xx = X2
For i = jd To 5 Step -2 'jd是精度控制参数
n12 = n1* n2*n12
n1 = n1 - 2
n2 = n2 - 2
xx = n12-xx
xx = X2* xx
Next
xx = x * xx
xx = xx / xjc
sum = x - xx
第二种方法用的高精加,减,乘(万进制硬乘配千进制FFT乘),除(估商配迭代除法)是我自已写的,万位精度sinx在32位机上用时100秒左右,
网上有个(BTCAL疯狂计算器v2.5,里面很多运算非常强大)万位精度sinx在我的电脑上用时22秒,不过它的高精乘法速度是我的乘法的十倍,也就是说它的三角函数算法速度可能和我的差不多。