Pregunta

Aquí hay una pregunta muy fácil para los chicos de VBA. Estoy ejecutando el método de Newton en algunas funciones, y ocasionalmente encuentro la suposición de que solo puedo asumir que se desborda la función Exp () (y detiene el código). ¿Qué sugerencias tienen ustedes para simplemente manejar este caso? (¿Quizás algún tipo de manejo de errores?)

Si el método de Newton falla debido a este o cualquier tipo de explosión, me gustaría continuar con mi código de bisección debajo de ese punto.

Por cierto, he pensado en tal vez tomar registros para hacer que esta situación sea menos probable, pero para ser honesto, estoy trabajando con algunas matemáticas que aún no entiendo completamente y me gustaría manejar el caso de falla del método de Newton. en cualquier caso, primero.

Descargo de responsabilidad: Soy un principiante completo de VBA, por lo que cualquier sugerencia sería leída y apreciada. Gracias de antemano.

Editar: Me pidieron que publique el código. Primero, gracias por leer. Desafortunadamente, no puedo publicar el código completo por razones comerciales, pero puedo dar un esquema muy básico. Creé un módulo y una función. Dentro de esta función, tengo:

Newtons Method Loop

Bisection Loop

Dentro del ciclo del método de Newton, he rastreado hasta un punto en el que tengo una próxima suposición de algo alrededor de 28,000 más o menos, y estoy asignando a una variable h el valor Exp (28,000) o rotondas. El depurador se interrumpe en ese punto; mi código esencialmente sale, y cualquier valor que mi función debería devolver produce # ¡VALOR! en mi celda.

Sé que no se trata de mucha información, pero espero (y creo) que sea suficiente. Corrígeme si me equivoco.

Edición 2: si todo lo demás falla, captaré explícitamente valores demasiado grandes, pero me pregunto si existe una solución más sólida y elegante.

¿Fue útil?

Solución

No es sorprendente que se desborde dado que Exp(28,000) es 1.8x10 12160 , el valor máximo que puede pasar a Exp es ~ 709.

Si desea salir de su ciclo si encuentra un valor que es demasiado grande, simplemente verifique el valor antes de pasarlo;

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

Otros consejos

Hace un tiempo se publicó un problema SO relacionado con números más grandes que Longen VBA .

La respuesta aceptada apuntaba a un enlace llamado aritmética de números grandes .Intenté implementar su ejemplo de exp (28000) usando ese ejemplo, pero recibí un error de "No coinciden los tipos" después de procesar algunos bucles.Sin embargo, puede ser culpa de mi apresurada implementación.Si no tiene pistas hasta ahora, empezaría por ahí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top