2012-04-12 3 views
1

Я пытаюсь построить метод, который вычисляет внутреннюю норму прибыли http://www.investopedia.com/articles/07/internal_rate_return.asp#axzz1rm5UPp8V, когда пользователь нажимает кнопку. Денежные потоки уже хранятся в NSMutableArray, называемом «cashFlows». Теперь в массиве, если у меня есть значения say -100, 100, 100, 100 с процентной ставкой 10%, он отлично работает. Но когда у меня есть значения say -5, 100, 100, 100, программа вылетает и/или зависает.Почему эта петля падает?

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

-(IBAction) calculateIRR{ 
double NPV; 

double rate = 0.1; 
int period = 1; 
double tempPV = 0; 
int count = 0; 

do{ 
    NPV = 0; 
    period = 1; 
    for (int i=0; i < [cashFlows count]; i++) { 
     double amount = ([[cashFlows objectAtIndex:i] doubleValue]); 
     if(i == 0){ 
      NPV = amount; 
     } else{ 
      tempPV = (amount/pow(1+rate,period)); 
      NPV = tempPV + NPV; 
      period++; 
     } 
    } 
    rate = rate + 0.0000001; 
    count++; 
} while(NPV > 0); 

answer.text = [[NSString alloc] initWithFormat:@"%.4f %%", rate * 100]; 
} 
+3

Скорее всего, NPV никогда не приближается к нулю для ваших заявленных значений. –

+0

не может быть причиной, но shoudln't и сравнить NPV> 0.0? – chikuba

+0

Если ваша программа разбилась, в какой-то момент она потерпит крах. Вы не можете пройти? –

ответ

2

С входными значениями -5, 100, 100, 100 IRR составляет 2000%. Ваш алгоритм должен пройти через цикл 20 миллиардов раз! Может быть, в какой-то момент у вас заканчивается память, или это занимает много времени.

Вы должны использовать более эффективный численный алгоритм. Самый простой, о котором я могу думать, это метод Bisection: http://en.wikipedia.org/wiki/Bisection_method

Вы должны выбрать разумные отправные точки, но также добавить способ изменения начальных точек, если решение лежит за пределами интервала (или нарушить алгоритм и выйти с предупреждение о неподходящем вводе).

+0

Я думаю, проблема не в сбое, а в замораживании. И, как вы написали, это из-за этого большого количества циклов – Friedrich

Смежные вопросы