郭先抢 发表于 2013-1-13 14:28:59

50# 云梦


能上传部分源代码看看吗?
我想看看源代码,并不是我想窃取你的劳动果实,而是我想学一学如何用visual basic
编程序

郭先抢 发表于 2013-1-13 14:29:54

软件感觉不错,很想学一学你的程序!我是个vb菜鸟,只懂一点点,所以。。。

云梦 发表于 2013-1-14 08:29:51

计算伽马函数的VB原代码示例:
Function Gamma()
Dim xm, MMU As Long
Dim pRes As String
Dim L0 As String
Dim Gmz, srd As Single
srd = DEG
DEG = 1
fsgamma = "0"
Gmz = 0    'x 是否为指定值标志
    Zx = Ax
If Ax.zs > -1 Then   '判断 x 是否整数
Bx = Ax
Bx.St = Left(Ax.St, Ax.zs + 1)
Bx.zs = Len(Bx.St) - 1
hsfx = "-"
Call Addition
If Left(Ax.St, 1) = "0" Then'如果 x 是整数
    xm = Val(Left(Zx.St, Zx.zs + 1))   '取整数部分进行判断
    If Zx.bz = "" And (xm = 1 Or xm = 2) Then Gmz = 1   'x=1 x=2 时
    If Zx.bz = "-" Or xm = 0 Then Gmz = 2   'x=0,-1,-2,-3.....时
End If
End If
Ax = Zx
If Gmz = 0 Then
If Ax.bz = "-" Then'负数的伽马
      fsgamma = 1
      Ax.bz = ""
      Bx.bz = ""
      Bx.St = "1"
      Bx.zs = 0
      hsfx = "+"
      Call Addition
      Zx = Ax
End If
    Px = Ax
    Wx = Ax
    Hg = Ax
    Select Case ychen
       Case Is = 64
          MMU = 90
       Case Is = 128
          MMU = 130
       Case Is = 256
          MMU = 200
       Case Is = 512
          MMU = 540
       Case Is = 1024
         MMU = 8400
    End Select
   
    If Zx.zs < 0 Then
            Ax = Px
            Wx = Px
            Bx.bz = ""
            Bx.St = "1"
            Bx.zs = 0
            hsfx = "+"
            Call Addition
            Wx = Ax
            L0 = Mid(Ax.St, Ax.zs + 2)
            Cx = Hg
            Call mult_
            Hg = Cx
            
      For xm = 2 To MMU 'Γ(10000+z)
            Ax.St = Trim(Str(xm))
            Wx.zs = Len(Ax.St) - 1
            Wx.St = Ax.St + L0
            
            Ax = Wx
            Cx = Hg
            Call mult_
            Hg = Cx
      Next xm
      Px = Wx
    Else
    L0 = Mid(Px.St, Px.zs + 2)
    If Val(Left(Zx.St, Zx.zs + 1)) < MMU Then
            For xm = 1 To MMU 'Γ(10000+z)
                Ax.St = Trim(Str(1 + Val(Left(Px.St, Px.zs + 1))))
                Px.zs = Len(Ax.St) - 1
                Px.St = Ax.St + L0
                Ax = Px
                Cx = Hg
                Call mult_
                Hg = Cx
            Next xm
      Else
         Hg = Zx
         Px = Zx
      End If
    End If
   
    Ux = Hg
    Ax = Px'Px=1000+z
    Call Lnx 'lnz
    ix = Ax
    '
    Ax = Px
    Bx.bz = ""
    Bx.St = "5"
    Bx.zs = -1
    hsfx = "-"
    Call Addition 'z-1/2
    Cx = Ax
    Ax = ix
    Call mult_'(z-1/2)*lnz
    Bx = Px
    hsfx = "-"
    Call Addition'(z-1/2)Lnz-z
    Bx.bz = ""
    Bx.St = epx(15) 'ln(√2Pi)
    Bx.zs = -1
    hsfx = "+"
    Call Addition 'Sx=(z-1/2)Lnz-z+ln(√2Pi)
    Sx = Ax
    '
    Cx = Px   '1000+z
    Ax = Cx
    Call mult_ 'z2
    Tx = Ax    'Tx=z2
    Lx = Px   'z
    Cx.bz = ""
    Cx.St = "12"
    Cx.zs = 1
    Ax = Px
    Call mult_ 'z*12
    Ax = Cx
    Cx.bz = ""
    Cx.St = "1"
    Cx.zs = 0
    Call multx_ '1/(z*12)
    Ax.bz = ""
    Hg = Ax
    Hg.bz = ""
    '求和 ∑
    For xm = 2 To 200 '(-1)B2xm/(2xm(2xm-1)z)
      Cx = Lx   'Lx=z(2xm-1)
      Ax = Tx   'Tx=z2
      Call mult_'z3
      Lx = Cx    'Lx=z3
      Ax = Cx
      
      Cx.bz = ""
      Cx.St = CStr(2 * xm * (2 * xm - 1))
      Cx.zs = Len(Cx.St) - 1
      Call mult_    '2xm(2xm-1)z
      Ax = Cx
      Cx = pm2(2 * xm)
      Call mult_    'B2xm(分母)*2xm(2xm-1)z
      Ax = Cx
      Cx = pz2(2 * xm)
      Call multx_   'B2xm(分子)/{B2xm(分母)*2xm(2xm-1)z}
      Wn = Cx
      Ax = Cx
      Bx = Hg
      hsfx = "+"
      Call Addition
      Hg = Ax
      If Wn.zs < -xChen Then Exit For
    Next xm
    Bx = Hg
    Ax = Sx
    hsfx = "+"
    Call Addition
    Sx = Ax'Sum 求和结束
    Ax = Ux
    Call Lnx
    Bx = Ax
    Ax = Sx
    hsfx = "-"
    Call Addition
    Sx = Ax
    Ax = Px
    Call Lnx
    Bx = Sx
    hsfx = "+"
    Call Addition
If fsgamma = 1 Then
      Vx = Ax
      Ax.bz = ""
      Ax.St = Pi.Tag
      Ax.zs = 0
      Cx = Zx
      Call mult_
      Ax = Cx
      Call xSin
      Gammbz = Ax.bz
      Cx.bz = ""
      Cx.St = Pi.Tag
      Cx.zs = 0
      Call multx_
      Ax = Cx
      Call Lnx
      Bx = Vx
      hsfx = "-"
      Call Addition
End If
Else
   If Gmz = 1 Then'x=1,2 时 Γ(x)=1
       Ax.bz = ""
       Ax.St = "0"
       Ax.zs = "0"
   Else
       Text12.Text = "-→∞ (无穷大)"   'x=0,-1,-2,-3....时 Γ(x)=∞
   End If
End If
DEG = srd '恢复三角函数制式(弧度,度,梯度)

云梦 发表于 2013-1-14 08:32:21

计算实例:
Gamma=2.2880377953400324179595889090602339228896881533562224411993807454704710066085042825007253044679284747968492456163619736990086693068610684720719929526723030053489815429191959102611884193668794490992029541491572661438362658155059636402680610560412995023428572826183864816514132279851720320360861870024470511009961650028651601111561894239076005577921680490380611694414733267466945500752573250190012765539633365280130189120138691770838670048888356517427638773037998537252598048473914927354467723366483939306412743620 E0

Gamma[-0.9]=-1.0570564109631924262547207974739335769500642917875974825611111967149183759247578901707959771407163566441550287690113503822012272204536656437724552070348384652010074010435712807443049327495784005882882331444625260150178173814720139546897073184335868849137176626529366498372865716422604903386218900984502412837245905669753669097096301130708558392298748589544459136929945703037527541817131388712011444761809695207975411846305421133341651770623266953056232548078614752536919951874359416895723263937984783317257170929 E1

云梦 发表于 2013-1-14 08:40:08

这款计算器不是提供给数学研究用的,它是工程计算人员的计算工具。适合、中、高、大学及非数学专业的学生、技术人员、工程师、数学爱好者等等。因此没有要求很高的计算精度,1024位已经足够了,一般常用64位和128位,这已经大大超出现有计算器的计算能力,且目前已经包含近200个常用函数、分布函数、积分函数、反函数、统计、解一元4次以下根、常用图形的面积和体积及众多的数学常数。
该计算器最大的特点是可以随时把自己常用和喜欢的函数、表达式纳入计算器,为特殊用途提供更多方便。

云梦 发表于 2013-1-14 08:45:24

百度里可以找到该计算器前期vb源码,只包括常用函数。

云梦 发表于 2013-1-14 08:53:37

上面的是伽马的内部调用函数,下面才是主函数。
Private Sub Command39_Click()'2012-08.09
Call StoF
Dim pRes As String

Select Case Text8.Text
Case Is = ""'Gamma函数
    NameF.Text = "Γ(x) ="
    Call SJbz
    Call Gamma
    If Ax.zs > 15 Then
      Cx = Ax
      Ax.St = epx(11)
      Ax.bz = ""
      Ax.zs = -1
      Call mult_
      Ax = Cx
      Ax.St = Mid(Cx.St, Cx.zs + 2)
      For i = 1 To xChen
         If Mid(Ax.St, i, 1) <> "0" Then Ax.St = Mid(Ax.St, i): Exit For
      Next i
      Ax.zs = -i
      Sx.St = Left(Cx.St, Cx.zs + 1)
      Cx.St = epx(10)
      Cx.bz = ""
      Cx.zs = 0
      Call mult_
      Call Exp
      
      'Ln(gamma)
      If Val(Sx.St) < 10 ^ 16 Then
            Ax.zs = Val(Sx.St)
            Call sc(Ax.bz, Ax.St, Ax.zs)
      Else
            If Val(Sx.St) < 32 Then
                pRes = Left(Ax.St, 1) + "." + Mid(Ax.St, 2, 10) + " E" + Sx.St
            Else
                pRes = Left(Ax.St, 1) + "." + Mid(Ax.St, 2, 10) + " E" + Str(Val(Sx.St))
            End If
                Prints.Text = pRes
                pRes = Left(Ax.St, 1) + "." + Mid(Ax.St, 2, ychen - 1) + " E" + Sx.St
            Text11.Text = pRes
      End If
    Else
      Call Exp
      Ax.bz = IIf(fsgamma = 1, Gammbz, Ax.bz)
      Call sc(Ax.bz, Ax.St, Ax.zs)
    End If
可以计算到9x10^11次方的伽马。

liangbch 发表于 2013-1-14 12:01:28

1. 作为一个同样致力于数学函数的高精度计算的工作者,首先,我对楼主的产品表示肯定和鼓励。

2。这类软件,往大了说,叫做计算机代数系统(Computer algebra system), 大块头的商业软件Maple,Mathcad,Mathematica就属于此类。轻量级的OPen Source的PARI/GP也属于此类。见http://en.wikipedia.org/wiki/Computer_algebra_system。 往小了说,叫做任意精度计算(Arbitrary-precision arithmetic),见http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic。 以库形式发布的有GMP,CLN,MPFR,MIRACL,NTL。提供库和一体化程序的bc,PARI/GP,Maple,Maxima,Mathematica,sage等。

3. 关于界面问题。对于计算器这种软件来说。命令行/脚本形式的接口是最好的。他可以完成批量计算,可以解决复杂的问题。但对于初学者,命令行语法不变记忆,较难学习,所以GUI形式的接口可能是最简单的。

4. 我推荐PARI/GP 和bc(Linux下的命令行计算器),这两个软件都是free的,而且是轻量级的,易于学习,功能也够用。昨天晚上,我还给我儿子讲了45分钟的课,关于PARI用法的。


顺便说一下,我自己也致力于这类软件的开发,23年前,我就用只有8位10数精度的计算器,用了一个寒假的时间,算出精度达26位数字的对数表,那时我没有见过电脑。考大学时,报考的是计算机专业,这完全是从我的兴趣出发,那时我以为计算机可以直接计算几百位10进制数,上了大学,就有了电脑,就可以将初等函数算到更高的精度了。我从未放弃此类研究。我的一个重要的理想就是开发出比GMP更快的大数运算库。

郭先抢 发表于 2013-1-14 14:14:49

1. 作为一个同样致力于数学函数的高精度计算的工作者,首先,我对楼主的产品表示肯定和鼓励。

2。这类软件,往大了说,叫做计算机代数系统(Computer algebra system), 大块头的商业软件Maple,Mathcad,Mathe ...
liangbch 发表于 2013-1-14 12:01 http://bbs.emath.ac.cn/images/common/back.gif
你把mathematica软件破解了,你就能超过GMP了

郭先抢 发表于 2013-1-14 14:18:32

我也想搞一个类似的计算器,只不过是用来求解专业的问题,最近在看vb的书籍,学习是很重要的,
但是我却是一个菜鸟,对很多东西都不懂!
页: 1 2 3 4 5 [6] 7 8 9 10 11 12 13
查看完整版本: 真正的高精度科学计算器