云梦 发表于 2013-6-17 09:12:38

再继续优化不知道该怎么办?用分治法计算一次1024位乘法0.0024秒,用HugeCalc是0.004秒。
Function Mult_() '分治法   多位数相乘C*A=C,A 2013-06.14
Dim myVar, myNum, Var, r As Variant
Dim Aa, Ba, Ca, xP2 As Single
Dim Dx As Chen
Dim ax_sz(512), bx_sz(512), cx_sz(512) As Variant
      
Ax.St = Ax.St + Zero
Cx.St = Cx.St + Zero

If Left(Ax.St, 1) > "0" And Left(Cx.St, 1) > "0" Then
    For i = 0 To xP
      ax_sz(i) = CDec(Mid(Ax.St, i * Gsw + 1, Gsw))
      bx_sz(i) = CDec(Mid(Cx.St, i * Gsw + 1, Gsw))
    Next i

    myVar = ax_sz(0) * bx_sz(0)
    cx_sz(1) = myVar
    For i = 1 To xP
       myNum = ax_sz(i) * bx_sz(i)
       myVar = myVar + myNum
       For j = 0 To (i - 1) / 2
      cx_sz(i + 1) = cx_sz(i + 1) + (ax_sz(i - j) - ax_sz(j)) * (bx_sz(j) - bx_sz(i - j))
       Next
       cx_sz(i + 1) = cx_sz(i + 1) + myVar
    Next
   
   r = CDec(0)
For i = xP To 0 Step -1
    cx_sz(i) = cx_sz(i) + r
    r = Fix(cx_sz(i) / Zero6)
    cx_sz(i) = cx_sz(i) - r * Zero6
Next i

oResult = CStr(cx_sz(0))
For i = 1 To xP
    oResult = oResult + Right(Zero06 + CStr(cx_sz(i)), Gsw)
Next i

Dx.Bz = IIf(Ax.Bz = Cx.Bz, "", "-")
Dx.St = oResult

'指数计算
Aa = Val(Left(Ax.St, 1))
Ba = Val(Left(Cx.St, 1))
Ca = Val(Left(Dx.St, 1))

If Ax.Zs + Cx.Zs < 10 ^ 15 Then
    Dx.Zs = Ax.Zs + Cx.Zs + IIf(Aa * Ba <= Ca, 0, 1)
Else
    Dx.Zs = 0
End If

Cx = Dx
Ax = Dx

Else
   Ax.Bz = ""
   Ax.St = "0"
   Ax.Zs = 0
   Cx = Ax
End If
End Function

云梦 发表于 2013-6-17 09:17:39

如果去掉
Ax.St = Ax.St + Zero
Cx.St = Cx.St + Zero
时间为0.002秒,相当于HugeCalc速度的1/2

云梦 发表于 2013-6-17 10:53:42

各精度的计算时间:

云梦 发表于 2013-6-17 11:11:45

用HugeCalc乘法计算2048位时间为0.01秒,3072位时间为0.019秒。用分治法计算2048位为0.0076秒,3072位时间为0.016秒。看来5000位以下FFT并不合算(当然我指的是用VB)。
分治法1024位计算比硬乘法节约大约1/3的时间。

ysr 发表于 2013-6-20 12:52:50

云梦 发表于 2013-6-24 16:48:52

VB计算512位Gamma函数1.3秒,1024位达6.6秒。已经尽力了。
如何加快Gamma函数的收敛是关键。伯努利常数用到BernoulliB时,Gamma函数的精度才能达到1034位。

云梦 发表于 2013-7-4 17:28:38

Gamma/Gamma的计算时,当n>1000000以上时有没有更好的计算公式可以加快收敛速度?
我的VB计算器遇到难点,64位十进制精度当n=100000时计算时间是10秒,更大时就很慢。

云梦 发表于 2013-7-6 09:50:07

n<10^255,z<10^256时:
γ(n,z)值计算成功。
但Γ(n,z)该如何能计算呢?

云梦 发表于 2013-8-10 12:26:34

不完全伽马函数的计算终于完成了。
关于γ(n,z) 和 Γ(n,z)计算确很复杂,对于自变量n,z:-∞<n<+∞,-∞<z<+∞好不容易全部解决l了,包括复数值的计算。
当n为负整数时,只有采用极限法确定所需要的精度值,因为 Γ(n)=∞,这就需要高精度的Gamma的计算。
重新改进的函数计算器,函数值增加了复数,使得自变量可在-∞到+∞范围。不过还不能输入复数。
已完成的函数有:Exp,Log,x^y,Sin,Cos,Tan
对数积分函数: li,Li
指数积分函数:Ei,E
误差函数,Erf 和正态分布函数
伽马函数:Gamma,LnGamma,PolyGamma,PolyGamma
其它积分函数:Si,Ci,S,C
不完全伽马函数:Γ(n,z),γ(n,z)

云梦 发表于 2013-8-10 15:35:32

这真是个伟大而消磨时间的工程,不过从编程中确能找到解决问题的方法,学到更多的编程技巧,从中收益不浅。
页: 1 2 3 [4] 5
查看完整版本: 几个VB小程序