2013-07-20 10 views
7

に、私は金融のアプリを開発し、IRR (in-built functionality of Excel)計算を必要としていますし、C#hereChereで、このような偉大なチュートリアルと、このような答えを見つけました。計算IRR(内部収益率リターン)とNPVは、プログラムのObjective-C

私は上記のC言語のコードを実装しましたが、IRRが正である場合には完璧な結果が得られます。それは負の値を返してはなりません。 Excelでは、=IRR(values,guessrate)は一部の値に対して負のIRRも返します。

私は上記のC#リンクでもコードを参照していますが、それは良いプロシージャを実行してエラーを返し、Excelと同様に負のIRRも返すことを期待しているようです。しかし、私はC#に精通していないので、私はObjective-CまたはCで同じコードを実装することができません。

私は皆さんを助けるために実装した上記のリンクからCコードを書いています。

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

Excelと上記の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

スタートをあなたのコードをフォーマットして:あなたは変更する必要があります。 –

+0

このリンクでは、フォーマットされたコードを見ることができます。http://www.codeproject.com/Tips/461049/Internal-Rate-of-Return-IRR-Calculation?msg=4616844#xx4616844xx –

+0

私は同じ形式のコードがリンク; 1、2、3桁のインデント。すごく醜い。 –

答えて

4

low_rateとhigh_rateは両方とも正であるため、負のスコアを取得することはできません。これは読みにくいので、例えばへ

#define LOW_RATE 0.01 

#define LOW_RATE -0.5 
+0

うわー、これはチャームのように働いています。ありがとうございます。 –

関連する問題