Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 23:24   #1
Sharamoff
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 3
По умолчанию Рекурсия. Не удается перевод функции с VBA на Delphi

Имеется вот такая функция на VBA, которая имитирует итерационное вычисление в Excel:
Код:
Const ACCURACY = 0.001
Const ITERATIONS = 100

Function calcLoopPrice(zatr, dolemat, upr, rent, NDS)
  Delta = ACCURACY + 1
  i = 0
  uprSumPred = 0
  uprSumNew = 0
  Do While Delta > ACCURACY And i < ITERATIONS
    calcLoopPrice = (((zatr + uprSumNew) * (1 + (rent * (dolemat + (upr * dolemat / 100) - 0.2) / 100) / 100)) * (1 + NDS / 100))
    uprSumNew = calcLoopPrice * upr / 100
    Delta = Abs(uprSumNew - uprSumPred) / Abs(uprSumNew)
    i = i + 1
    uprSumPred = uprSumNew
  Loop
End Function
Все работает в Excel. Пытаюсь преобразовать эту функци. на Delphi 7 вот так:
Код:
const
  ACCURACY = 0.001;
  ITERATIONS = 100;

function calcLoopPrice(zatr:Real; dolemat:Real; upr:Real; rent:Real; NDS:Real): Real;
var
  i: byte;
  Delta, uprSumPred, uprSumNew: Real;
begin
  Delta := ACCURACY + 1;
  i := 0;
  uprSumPred := 0;
  uprSumNew := 0;
  While (Delta > ACCURACY)AND(i < ITERATIONS) do
    begin
    calcLoopPrice := (((zatr + uprSumNew) * (1 + (rent * (dolemat + (upr * dolemat / 100) - 0.2) / 100) / 100)) * (1 + NDS / 100));
    uprSumNew := calcLoopPrice(zatr, dolemat, upr, rent, NDS) * upr / 100;
    uprSumPred := uprSumNew;
    Delta := Abs(uprSumNew - uprSumPred) / Abs(uprSumNew);
    i := i + 1;
    end;
end;
И ничего не выходит. Цикл итерации игнорируется, отрабатываются только строчки calcLoopPrice := ... и uprSumNew := ...
uprSumNew не считается и так и остается = 0.
Ну и вываливается все в Stack Overflow т.к. не срабатывает выход из цикла.

Пытался отловить проблему упрощая цикл до примерно
Код:
for i := 1 to 3 do
begin
calcLoopPrice := (((zatr + uprSumNew) * (1 + (rent * (dolemat + (upr * dolemat / 100) - 0.2) / 100) / 100)) * (1 + NDS / 100));
    uprSumNew := calcLoopPrice(zatr, dolemat, upr, rent, NDS) * upr / 100;
end
цикл отрабатывает, функция считает, но все uprSumNew = 0. Т.е. не срабатывает рекурсия.
Но на VBA то все работает.
Помогите, люди добрые весь мозг сломал уже. Не такой уж я специалист по Delphi то. В интернетах все в примерах рекурсией фракталы считают, а вот такой бухгалтерской функции по расчету налогов и нету.
С уважением.
Sharamoff вне форума Ответить с цитированием
Старый 15.01.2013, 23:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В vba почти ничего, но там по моему и нет рекурсии
Код:
    Result := (((zatr + uprSumNew) * (1 + (rent * (dolemat + (upr * dolemat / 100) - 0.2) / 100) / 100)) * (1 + NDS / 100));
    uprSumNew := Result * upr / 100;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.01.2013, 08:21   #3
Sharamoff
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 3
По умолчанию

Спасибо, все получилось.
Хотя точность вычисления получилась неудовлетворительной. Не сильно, но результат расходится с Excel.
Sharamoff вне форума Ответить с цитированием
Старый 16.01.2013, 08:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Extended вместо real попробуйте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.01.2013, 09:19   #5
Sharamoff
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 3
По умолчанию

Пробовал Currency. Не очень.
Sharamoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA excel не удается закрыть и сохранить книгу без возникновения диалогового окна Tvilla Помощь студентам 2 28.06.2012 11:01
доделать перевод функции из фортрана в VBA meigas Помощь студентам 0 29.05.2012 20:43
VBA и рекурсия AnatolyF Microsoft Office Excel 2 17.05.2012 19:36
Рекурсия в VBA AnatolyF Помощь студентам 0 16.05.2012 14:11
Перевод кода из Delphi в VBA prem1era Microsoft Office Access 1 15.05.2012 12:39