2

これがVBAの人たちにとって非常に簡単な質問です。一部の関数でニュートン法を実行していますが、Exp()関数のオーバーフロー(およびコードの停止)しか想定できないと推測されることがあります。このケースを単純に処理するために、どのような提案が必要ですか?(多分ある種のエラー処理?)

これまたは何らかの種類の爆発が原因でニュートン法が失敗した場合は、そのポイントより下の二分法に進みたいと思います。

ちなみに、この状況を少なくするためにログを取ることを考えていましたが、正直なところ、まだ完全には理解していない数学を使って作業しているので、いずれにせよニュートン法が失敗した場合に対処したいと思います。最初。

免責事項:私は完全なVBA初心者なので、提案を読んでいただければ幸いです。前もって感謝します。

編集:コードを投稿するように依頼されました。まず、読んでくれてありがとう。残念ながら、ビジネス上の理由からコード全体を投稿することはできませんが、非常に基本的な概要を説明することはできます。モジュールと関数を作成しました。この関数の中には、次のものがあります。

Newtons Method Loop

Bisection Loop

ニュートン法のループ内で、28,000程度の次の推測があるポイントまでトレースし、変数hに値Exp(28,000)またはラウンドアバウトを割り当てています。デバッガーはその時点で壊れます。私のコードは本質的に終了し、関数が返す必要のある値が何であれ、#VALUEを生成します。私の独房で。

これは多くの情報ではないことを私は知っていますが、それで十分であることを願っています(そして考えています)。私が間違っている場合は私を訂正してください。

編集2:他のすべてが失敗した場合、私は明示的に大きすぎる値をキャッチするつもりですが、より堅牢でエレガントなソリューションがあるかどうか疑問に思います。

4

2 に答える 2

2

Exp(28,000)1.8x10 12160であることを考えると、オーバーフローするのは当然のことです。渡すことができる最大値は〜709ですExp

値が大きすぎる場合にループを終了する場合は、値を渡す前に値を確認してください。

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 ....
于 2011-06-13T16:11:03.017 に答える
0

VBAでLongより大きい数値を処理するために、しばらく前に投稿されたSOの問題がありました。

受け入れられた答えは、 LargeNumberArithmeticと呼ばれるリンクを指しています。その例を使用してexp(28000)の例を実装しようとしましたが、いくつかのループを処理した後、「TypeMismatch」エラーが発生しました。しかし、それは私の急いでの実装のせいかもしれません。これまでにリードがない場合は、そこから始めます。

于 2011-06-13T14:29:45.720 に答える