2013-07-20 6 views
7

Zajmuję się tworzeniem aplikacji finansowych i wymagają obliczenia IRR (in-built functionality of Excel) i znaleźć takie wielkie samouczki w Chere i taką odpowiedź w C#here.Oblicz IRR (wewnętrzna stopa zwrotu) i NPV programowo w Objective-C

I wdrożone kod języka C powyżej, ale daje doskonałe rezultaty przy IRR jest pozytywna. Nie zwraca wartości ujemnej, kiedy powinna być. Natomiast w Excelu =IRR(values,guessrate) zwraca również ujemną wartość IRR dla niektórych wartości.

mam, o których mowa powyżej kod w C# linku też, i wydaje się, że wynika dobrych procedur i zwraca błędy i również nadzieję, że zwraca też negatywny IRR, tak samo jak Excel. Ale nie jestem zaznajomiony z C#, więc nie jestem w stanie zaimplementować tego samego kodu w Objective-C lub C.

Piszę kod C z powyższego linku, który zaimplementowałem, aby pomóc wam.

#define LOW_RATE 0.01 
#define HIGH_RATE 0.5 
#define MAX_ITERATION 1000 
#define PRECISION_REQ 0.00000001 
double computeIRR(double cf[], int numOfFlows) 
{ 
    int i = 0, j = 0; 
    double m = 0.0; 
    double old = 0.00; 
    double new = 0.00; 
    double oldguessRate = LOW_RATE; 
    double newguessRate = LOW_RATE; 
    double guessRate = LOW_RATE; 
    double lowGuessRate = LOW_RATE; 
    double highGuessRate = HIGH_RATE; 
    double npv = 0.0; 
    double denom = 0.0; 
    for (i=0; i<MAX_ITERATION; i++) 
    { 
     npv = 0.00; 
     for (j=0; j<numOfFlows; j++) 
     { 
      denom = pow((1 + guessRate),j); 
      npv = npv + (cf[j]/denom); 
     } 

     /* Stop checking once the required precision is achieved */ 
     if ((npv > 0) && (npv < PRECISION_REQ)) 
      break; 
     if (old == 0) 
      old = npv; 
     else 
      old = new; 
     new = npv; 
     if (i > 0) 
     { 
      if (old < new) 
      { 
       if (old < 0 && new < 0) 
        highGuessRate = newguessRate; 
       else 
        lowGuessRate = newguessRate; 
      } 
      else 
      { 
       if (old > 0 && new > 0) 
        lowGuessRate = newguessRate; 
       else 
        highGuessRate = newguessRate; 
       } 
     } 
     oldguessRate = guessRate; 
     guessRate = (lowGuessRate + highGuessRate)/2; 
     newguessRate = guessRate; 
    } 
    return guessRate; 
} 

Dołączyłem wynik dla pewnej wartości, która różni się w programie Excel i powyższym kodzie języka C.

Values:    Output of Excel: -33.5% 
1 = -18.5,   Output of C code: 0.010 or say (1.0%) 
2 = -18.5, 
3 = -18.5, 
4 = -18.5, 
5 = -18.5, 
6 = 32.0 

Guess rate: 0.1 
+1

Uruchom z formatowania kodu, ponieważ jest to trudne do odczytania. –

+0

Można zobaczyć kod sformatowany w ten link http://www.codeproject.com/Tips/461049/Internal-Rate-of-Return-IRR-Calculation?msg=4616844#xx4616844xx –

+0

widzę tylko ten sam kod źle sformatowana połączenie; wcięcie z 1, 2 i 3 spacjami; bardzo brzydki. –

Odpowiedz

4

Ponieważ wartości low_rate i high_rate są dodatnie, nie można uzyskać ujemnego wyniku. Trzeba zmienić:

#define LOW_RATE 0.01 

do, na przykład,

#define LOW_RATE -0.5 
+0

Wow, działa jak urok. Dziękuję bardzo. –