Переполнение VBA Exp()

Вот очень простой вопрос для парней VBA. Я использую метод Ньютона для некоторых функций, и иногда я нахожу предположение, что я могу только предположить, что функция Exp() переполняется (и останавливает код). Какие у вас есть предложения, ребята, чтобы просто справиться с этим делом? (Может быть, какая-то обработка ошибок?)

Если метод Ньютона потерпит неудачу из-за этого или любого другого вида взрыва, я хотел бы перейти к моему коду деления пополам ниже этой точки.

Кстати, я думал о том, чтобы, возможно, взять журналы, чтобы сделать эту ситуацию менее вероятной, но, честно говоря, я работаю с некоторой математикой, которую я еще не полностью понимаю, и я хотел бы в любом случае обработать случай сбоя метода Ньютона. первый.

Отказ от ответственности: я новичок в VBA, поэтому любые предложения будут прочитаны и оценены. Заранее спасибо.

Изменить: меня попросили опубликовать код. Во-первых, спасибо за чтение. К сожалению, я не могу опубликовать весь код по бизнес-причинам, но я могу дать самые общие наброски. Я создал модуль и функцию. Внутри этой функции у меня есть:

Newtons Method Loop

Bisection Loop

Внутри цикла метода Ньютона я проследил до точки, где у меня есть следующее предположение о чем-то около 28 000 или около того, и я присваиваю переменной h значение Exp(28 000) или круговое движение. В этот момент отладчик прерывается; мой код по существу завершается, и любое значение, которое должна возвращать моя функция, дает #ЗНАЧ! в моей камере.

Я знаю, что информации немного, но я надеюсь (и думаю), что ее должно быть достаточно. Поправьте меня, если я ошибаюсь.

Редактировать 2: если ничего не помогает, я собираюсь явно поймать слишком большие значения, но мне интересно, есть ли более надежное и элегантное решение.


person TNi    schedule 13.06.2011    source источник
comment
Пожалуйста, опубликуйте код, который вызывает ошибку, а также несколько примеров ввода и ожидаемых результатов - очень сложно попытаться отследить ошибку без какой-либо информации о том, что происходит.   -  person mdm    schedule 13.06.2011
comment
Если вы используете Excel, рассматривали ли вы возможность использования Solver или Goal Seek вместо написания собственной функции?   -  person Brian Camire    schedule 13.06.2011
comment
Я просмотрел метод Goal Seek, который, как я полагаю, будет слишком медленным для моего приложения. Решатель выглядит интереснее. Я мог бы исследовать это, чтобы увидеть, как это может упростить поиск корней в VBA в будущем.   -  person TNi    schedule 14.06.2011


Ответы (2)


Неудивительно, что он переполнится, учитывая, что 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 ....
person Alex K.    schedule 13.06.2011
comment
В итоге я использовал этот подход, который работает. Спасибо, что нашли для меня значение максимального показателя степени (к тому времени я мысленно умирал от борьбы с VBA). - person TNi; 14.06.2011

Некоторое время назад была опубликована проблема SO, касающаяся чисел больше, чем Long в VBA< /а>.

Принятый ответ указывал на ссылку под названием Арифметика больших чисел. Я только что попытался реализовать ваш пример exp(28000), используя этот пример, но получил ошибку «Несоответствие типов» после обработки нескольких циклов. Однако, возможно, это вина моей поспешной реализации. Если у вас пока нет зацепок, я бы начал с этого.

person ray    schedule 13.06.2011
comment
Спасибо за ссылку; это было хорошее чтение. К счастью, мне не нужно было фактически получать значение Exp(28000). Это было бы очень неприятно. - person TNi; 14.06.2011
comment
@TNi ... лол. НП. Я разобрался с проблемой, о которой говорил. Подпрограмме не нравились десятичные дроби для передаваемых значений. Это сработало, когда я только что прошел ints. Конечно, вычисление 271828^28000 вполне себе расчет... так что все равно. рад, что ты получил ответ. :D - person ray; 14.06.2011