缩放互补误差函数,erfcx(x),计算避免算术溢出 - VBA / Excel

时间:2016-01-11 14:15:13

标签: excel vba math

我需要一个算法/近似来计算缩放互补误差函数,erfcx(x)来双浮点精度。

我在工作PC上,所以我只能使用Excel和VBA,我不能使用外部库或加载项:我需要自己编写代码。

Excel仅提供erf()和erfc()函数。

关系erfcx(x)= exp(x ^ 2)erfc(x)显然是有用的,但是对于大于26.5的x有算术上/下流,我需要大于此。

下面的帖子讨论了一个python实现 - 但似乎并没有解决我能说的问题。它提供了使用其他库的解决方案或者不够精确的近似值来满足我的需求。

Is there a scaled complementary error function in python available?

有什么建议吗?

更新

我使用了我在维基百科上找到的Continued Fraction表示 以及用于解决此处http://finance4traders.blogspot.nl/2009/07/continued-fractions-and-modified-lentzs.html

中连续分数的算法的修改版本

以下代码似乎有效,实际上对较大的输入参数的迭代次数较少。

Function erfcx(x) As Variant
Dim Ai As Double
Dim Bi As Double
Dim Ci As Double
Dim Di As Double
Dim Ei As Double
Dim Fi As Double
Dim X2 As Double
Dim i As Long

Const SQRPI As Double = 1.7724538509055
Const MAX_ITERATIONS = 1000


If x < 26.5 Then
    erfcx = Application.WorksheetFunction.ErfC_Precise(x) * Exp(x ^ 2)
Else
    X2 = x ^ 2
    Bi = X2
    Fi = X2
    Ci = X2
    Di = 0
    Do
        i = i + 1
        Ai = i / 2
        If i Mod 2 = 0 Then
            Bi = X2
        Else
            Bi = 1
        End If
        Di = 1 / (Bi + Ai * Di)
        Ci = Bi + Ai / Ci
        Ei = Ci * Di
        Fi = Fi * Ei
    Loop While Ei <> 1 And i < MAX_ITERATIONS
    Debug.Print i
    erfcx = x / Fi / SQRPI
End If  End function

1 个答案:

答案 0 :(得分:0)

这里讨论了几个近似值:

AMS Journal Article

一旦确定哪种近似值合适,我们就可以帮助您在工作表函数或 VBA UDF()

中对其进行编码