VBA Exp()溢出

时间:2011-06-13 13:57:04

标签: excel vba exp

对于VBA球员来说,这是一个非常简单的问题。我正在某些函数上运行Newton的方法,偶尔我会发现我只能假设Exp()函数溢出(并停止代码)。你们有什么建议来处理这个案子? (也许某种错误处理?)

如果Newton的方法由于这种或任何类型的爆炸而失败,我想在这一点下面继续我的二分法。

顺便说一句,我已经考虑过可能采用日志来减少这种情况,但说实话我正在处理一些我尚未完全理解的数学,我想处理牛顿方法失败的情况无论如何,首先。

免责声明:我是一名完整的VBA初学者,所以任何建议都会被阅读和赞赏。提前谢谢。

编辑:我被要求发布代码。首先,感谢阅读。不幸的是,由于商业原因,我无法发布整个代码,但我可以给出非常准确的大纲。我已经创建了一个模块和一个函数。在这个功能里面,我有:

Newtons Method Loop

Bisection Loop

在Newton的方法循环中,我已经追溯到下一个猜测大约28,000左右的东西,我正在为变量 h 分配值Exp(28,000)或环形交叉路口。调试器在那时断开;我的代码基本上退出了,无论我的函数应该返回什么值,都会产生#VALUE!在我的牢房里。

我知道这不是很多信息,但我希望(并且认为)它应该足够了。如果我错了,请纠正我。

编辑2:如果所有其他方法都失败了,我将明确地捕获太大的值,但我想知道是否有更强大和更优雅的解决方案。

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)的示例,但在处理几个循环后收到“类型不匹配”错误。但是,这可能是我仓促实施的错误。如果你到目前为止没有任何线索,我会从那里开始。