VBA在excel里面编程的时候,出现了 “运行时错误6” ,溢出,恳请 大神们赐教

是这样的,一个题目,让自己模拟出标准正态分布的分布函数。也就是模拟出这个excel里面本身自带的函数:=Norm.s.dist(z,1)要求自己在VBA里面编写code写... 是这样的,一个题目,让自己模拟出标准正态分布的分布函数。
也就是模拟出这个 excel里面本身自带的函数: = Norm.s.dist(z,1)
要求自己在VBA里面编写code写一个function来实现这个算法。
我自己做了这个算法,用泰勒公式来计算 error function这个积分的,
但是到了一定程度,比如6个sigma开外,我的函数的结果就跟excel的norm.s.dist(z,1)
的结果有一些误差了,5个sigma之内的误差,在E-10以内。
我的代码是这样的,结果,我算z=8的时候就出现了 ”运行时错误6“,溢出

Option ExplicitOption Base 1
'L.D. I design this function to calculate the CDF of corresponding x
'L.D. I mainly use the Talor's Theorem to calculate the error function
'L.D. which is a part of the integral CDF of normal distribution

Function LiweiNormDist(x As Double) As Double
'so u = F(x) = F(0) + F^(-1)(0)*x + (F^(-2)(0)/2!)*x^2 + _ ' (F^(-3)(0)/3!)*x^3 + ...+ (F^(-n)(0)/n!)*x^n
'and here,as Norm.s.dist(0,1) = 0.5, so F(0) = 0.5,
'and in my formula above, F^(-1)(0) means the first derivative of
'F(x) at x = 0, and F^(-2)(0),F^(-n)(0) can be interpreted in the
'same way

Dim n As Integer, sum As Double, f() As Double, i As Integer
n = 0
sum = 0.5
ReDim f(1)
f(1) = x

Do
n = n + 1
ReDim Preserve f(n + 1)
f(n + 1) = -1 * f(n) * (x ^ 2) * (2 * n - 1) / ((2 * n + 1) * (2 * n))
Loop Until Abs(f(n + 1)) < 10 ^ (-18) And f(n + 1) > 0

For i = 1 To n + 1
sum = sum + f(i) * 1 / Sqr(2 * WorksheetFunction.Pi())
Next i

LiweiNormDist = sum

End FunctionSub mytest()
Dim t As Double t = InputBox("input your number: ")
MsgBox "it's gonna be " & LiweiNormDist(t)

End Sub

我想让误差尽可能地小一些,E-15就可以了。
展开
 我来答
权群28
2012-10-02 · TA获得超过750个赞
知道小有建树答主
回答量:513
采纳率:100%
帮助的人:215万
展开全部
Dim n As Integer, sum As Double, f() As Double, i As Integer

→ as开始以及后面的全去掉会有用吗?
Dim n , sum , f() , i
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蓝蓝艺觉
2012-10-02
知道答主
回答量:36
采纳率:0%
帮助的人:15.6万
展开全部
10 ^ (-18)位数太长了,造成内存溢出。一般EXCEL支持不了太长的位数的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
姓王的wy451

2012-10-02 · TA获得超过48.3万个赞
知道大有可为答主
回答量:8万
采纳率:78%
帮助的人:8921万
展开全部
问题出在 f(n + 1) = -1 * f(n) * (x ^ 2) * (2 * n - 1) / ((2 * n + 1) * (2 * n)) 语句的分母((2 * n + 1) * (2 * n)) 上,当n>90后,分母值大于整型最大值32767,所以溢出。因为计算中间值是按所含变量的数据类型存贮。
解决的办法有二:一是将n定义为长整型;二是将分母改为两个:即将……/ ((2 * n + 1) * (2 * n)) 改为 …… / (2 * n + 1) / (2 * n)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式