对于VBA球员来说,这是一个非常简单的问题。我正在某些函数上运行Newton的方法,偶尔我会发现我只能假设Exp()函数溢出(并停止代码)。你们有什么建议来处理这个案子? (也许某种错误处理?)
如果Newton的方法由于这种或任何类型的爆炸而失败,我想在这一点下面继续我的二分法。
顺便说一句,我已经考虑过可能采用日志来减少这种情况,但说实话我正在处理一些我尚未完全理解的数学,我想处理牛顿方法失败的情况无论如何,首先。
免责声明:我是一名完整的VBA初学者,所以任何建议都会被阅读和赞赏。提前谢谢。
编辑:我被要求发布代码。首先,感谢阅读。不幸的是,由于商业原因,我无法发布整个代码,但我可以给出非常准确的大纲。我已经创建了一个模块和一个函数。在这个功能里面,我有:
Newtons Method Loop
Bisection Loop
在Newton的方法循环中,我已经追溯到下一个猜测大约28,000左右的东西,我正在为变量 h 分配值Exp(28,000)或环形交叉路口。调试器在那时断开;我的代码基本上退出了,无论我的函数应该返回什么值,都会产生#VALUE!在我的牢房里。
我知道这不是很多信息,但我希望(并且认为)它应该足够了。如果我错了,请纠正我。
编辑2:如果所有其他方法都失败了,我将明确地捕获太大的值,但我想知道是否有更强大和更优雅的解决方案。
答案 0 :(得分:2)
鉴于Exp(28,000)
为1.8x10 12160 ,它会溢出并不奇怪,您可以传递给Exp
的最大值是~709。
如果您想要在遇到过大的值时退出循环,只需在传递之前检查该值;
function Newton
const MAX_EXP_ARGUMENT as double = 709.782712893#
do ....
if (abs(var) <= MAX_EXP_ARGUMENT) then
r = exp(var)
else
exit do '// exit the loop
end if
'//use r
loop
do ....
答案 1 :(得分:0)
有一个SO问题在一段时间后发布了numbers larger than Long in VBA。
接受的答案指向名为Large Number Arithmetic的链接。我只是尝试使用该示例实现exp(28000)的示例,但在处理几个循环后收到“类型不匹配”错误。但是,这可能是我仓促实施的错误。如果你到目前为止没有任何线索,我会从那里开始。