に、私は金融のアプリを開発し、IRR (in-built functionality of Excel)
計算を必要としていますし、C#
hereにC
hereで、このような偉大なチュートリアルと、このような答えを見つけました。計算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
スタートをあなたのコードをフォーマットして:あなたは変更する必要があります。 –
このリンクでは、フォーマットされたコードを見ることができます。http://www.codeproject.com/Tips/461049/Internal-Rate-of-Return-IRR-Calculation?msg=4616844#xx4616844xx –
私は同じ形式のコードがリンク; 1、2、3桁のインデント。すごく醜い。 –