【问题标题】:VBA Exp() OverflowVBA Exp() 溢出
【发布时间】:2011-06-14 00:11:03
【问题描述】:

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

如果牛顿的方法由于这种或任何类型的爆炸而失败,我想在该点以下继续我的二等分代码。

顺便说一句,我考虑过记录日志以降低这种情况的可能性,但老实说,我正在处理一些我尚未完全理解的数学,并且我想处理牛顿方法失败的情况无论如何都要先。

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

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

Newtons Method Loop

Bisection Loop

在牛顿的方法循环中,我已经追踪到一个点,我的下一个猜测大约是 28,000 左右,我将值 Exp(28,000) 分配给一个变量 h或环岛。调试器在那个时候中断;我的代码基本上退出了,我的函数应该返回的任何值都会产生#VALUE!在我的牢房里。

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

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

【问题讨论】:

  • 请发布导致错误的代码以及一些示例输入和预期输出 - 如果没有关于正在发生的事情的一些信息,很难尝试追踪错误。
  • 如果您使用 Excel,您是否考虑过使用 Solver 或 Goal Seek 而不是编写自己的函数?
  • 我查看了 Goal Seek 背后的方法,我猜我的应用程序收敛速度太慢。 Solver 看起来更有趣。我可能会对此进行研究,看看它如何使将来从 VBA 中查找根变得更容易。

标签: excel vba exp


【解决方案1】:

鉴于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 ....

【讨论】:

  • 我最终使用了这种有效的方法。感谢您为我找到最大指数的值(到那时,我因与 VBA 摔跤而精神崩溃)。
【解决方案2】:

在处理 numbers larger than Long in VBA 之前发布了一个 SO 问题。

接受的答案指向一个名为Large Number Arithmetic 的链接。我只是尝试使用该示例实现您的 exp(28000) 示例,但在处理几个循环后收到“类型不匹配”错误。但是,这可能是我仓促执行的错。如果你到目前为止还没有线索,我会从那里开始。

【讨论】:

  • 感谢您的链接;这是一本好书。幸运的是,我不需要实际获得 Exp(28000) 的值。那会很烦人。
  • @TNi ...大声笑。 NP。我确实弄清楚了我提到的问题。该例程不喜欢传递的值使用小数。当我刚刚通过整数时,它“起作用”了。当然,计算 271828 ^ 28000 是相当的计算......所以无论如何。很高兴你得到你的答案。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多