Calcola IRR (Internal Rate Return) e NPV programmaticamente nell'Obiettivo-C

Sto sviluppando un'applicazione finanziaria e ho bisogno di IRR (in-built functionality of Excel) calcolo IRR (in-built functionality of Excel) e ho trovato ottimi tutorial in C qui e una risposta in C# qui .

Ho implementato il codice della lingua C sopra, ma dà un risultato perfetto quando l'IRR è positivo. Non sta restando un valore negativo quando dovrebbe essere. Mentre in Excel =IRR(values,guessrate) restituisce anche un IRR negativo per alcuni valori.

Ho riferito anche al codice sopra il link C # e sembra che segue buone procedure e restituisce errori e spera anche che restituisca anche l'IRR negativo, uguale a Excel. Ma non ho familiarità con C #, quindi non sono in grado di implementare lo stesso codice in Obiettivo C o C.

Sto scrivendo codice C dal link sopra indicato che ho implementato per aiutare voi ragazzi.

 #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; } 

Ho allegato il risultato per un valore diverso in Excel e il precedente codice C di lingua.

  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 

Poiché low_rate e high_rate sono entrambi positivi, non è ansible get un punteggio negativo. Devi cambiare:

 #define LOW_RATE 0.01 

ad esempio,

 #define LOW_RATE -0.5