对于 VBA 人员来说,这是一个非常简单的问题。我在一些函数上运行牛顿法,偶尔我发现我只能假设溢出 Exp() 函数(并停止代码)。你们有什么建议可以简单地处理这个案子? (也许是某种错误处理?)
如果牛顿的方法由于这种或任何类型的爆炸而失败,我想在该点以下继续我的二等分代码。
顺便说一句,我考虑过可能会记录日志以降低这种情况的可能性,但老实说,我正在处理一些我尚未完全理解的数学,并且我想处理牛顿方法无论如何都失败的情况第一的。
免责声明:我是一个完整的 VBA 初学者,所以任何建议都会被阅读和赞赏。提前致谢。
编辑:我被要求发布代码。首先,感谢阅读。不幸的是,由于业务原因,我无法发布整个代码,但我可以给出非常简单的大纲。我创建了一个模块和一个函数。在这个函数中,我有:Newtons Method Loop
Bisection Loop
在牛顿方法循环中,我已经追踪到一个点,我下一次猜测大约是 28,000 左右,并且我将值 Exp(28,000) 或回旋处分配给变量 h。调试器在那个时候中断;我的代码基本上退出了,我的函数应该返回的任何值都会产生#VALUE!在我的牢房里。
我知道这不是很多信息,但我希望(并认为)它应该足够了。如果我错了,请纠正我。
编辑 2:如果所有其他方法都失败了,我将明确捕获太大的值,但我想知道是否有更强大和优雅的解决方案。
最佳答案
考虑到 Exp(28,000)
,它会溢出并不奇怪。是 1.8x1012160,您可以传递给 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 ....
关于excel - VBA Exp() 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6331416/