Question

Voici une question très facile pour les gars VBA. Je suis en cours d'exécution la méthode de Newton sur certaines fonctions, et parfois je trouve une supposition que je ne peux que supposer déversoirs la fonction Exp () (et arrête le code). Quelles suggestions avez-vous les gars doivent gérer simplement ce cas? (Peut-être une sorte de traitement des erreurs?)

Si la méthode de Newton échoue à cause de cela ou toute sorte de blowup, je voudrais continuer sur mon code bissectrice dessous de ce point.

Par ailleurs, j'ai pensé peut-être prendre les journaux pour rendre cette situation moins probable, mais pour être honnête, je travaille avec un peu de maths, je ne comprends pas encore tout à fait, et je voudrais traiter le cas de défaut de la méthode de Newton en tout état de cause première.

Disclaimer: Je suis un débutant VBA complet, de sorte que toutes les suggestions seront lus et appréciés. Merci à l'avance.

Edit: On m'a demandé de publier le code. Tout d'abord, merci pour la lecture. Malheureusement, je ne peux pas poster tout le code pour des raisons d'affaires, mais je peux donner les grandes lignes très de barebones. J'ai créé un module et une fonction. Dans cette fonction, je:

Newtons Method Loop

Bisection Loop

Dans la boucle de la méthode de Newton, je l'ai tracé à un point où j'ai une estimation suivante de quelque chose autour de 28000 ou, et je suis assignant à une variable h la valeur Exp (28000) ou ronds-points. Les pauses débogueur à ce moment-là; mon code essentiellement sorties, et quelle valeur ma fonction devrait être de retour produit #VALUE! dans ma cellule.

Je sais que ce n'est pas beaucoup d'informations, mais je l'espère (et pense), il devrait être suffisant. Corrigez-moi si je me trompe.

Edit 2:. Si tout le reste échoue, je vais prendre explicitement des valeurs trop grandes, mais je me demande s'il y a une solution plus robuste et élégant

Était-ce utile?

La solution

Pas étonnant qu'il débordera étant donné que Exp(28,000) est 1.8x10 12160 , la valeur maximale que vous pouvez passer à Exp est ~ 709.

Si vous voulez quitter votre boucle si vous rencontrez une valeur qui est trop grande, il suffit de vérifier la valeur avant de le transmettre;

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

Autres conseils

Il y avait un problème de SO a affiché un certain temps traitant plus grand que long en VBA .

La réponse acceptée a un lien appelé Grand Numéro Arithmétique. Je viens d'essayer de mettre en œuvre votre exemple de exp (28000) en utilisant cet exemple, mais a reçu une erreur « Incohérence de type » après traitement quelques boucles. Cependant, il peut être la faute de ma mise en œuvre hâtive. Si vous avez pas conduit à ce jour, je commencerais là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top