2013-07-20 9 views
7

Tôi đang phát triển một ứng dụng tài chính và yêu cầu IRR (in-built functionality of Excel) tính và tìm thấy hướng dẫn tuyệt vời trong Chere và câu trả lời như vậy trong C#here.Tính IRR (Internal Rate Return) và NPV lập trình Objective-C

Tôi đã triển khai mã ngôn ngữ C ở trên, nhưng nó mang lại kết quả hoàn hảo khi IRR là tích cực. Nó không trả về giá trị âm khi nó cần. Trong khi đó, trong Excel =IRR(values,guessrate) cũng trả về IRR âm tính cho một số giá trị.

Tôi đã đề cập đến mã ở trên liên kết C# quá, và có vẻ như nó theo quy trình tốt và trả về lỗi và cũng hy vọng rằng nó trả về IRR tiêu cực quá, giống như Excel. Nhưng tôi không quen thuộc với C#, vì vậy tôi không thể thực hiện cùng một mã trong Mục tiêu-C hoặc C.

Tôi đang viết mã C từ liên kết ở trên mà tôi đã triển khai để giúp các bạn.

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

Tôi đã đính kèm kết quả cho một số giá trị khác nhau trong Excel và mã ngôn ngữ C ở trên.

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

Bắt đầu với định dạng mã của bạn, bởi vì đây là khó đọc. –

+0

Bạn có thể xem mã được định dạng trong liên kết này http://www.codeproject.com/Tips/461049/Internal-Rate-of-Return-IRR-Calculation?msg=4616844#xx4616844xx –

+0

Tôi chỉ thấy cùng một mã được định dạng sai liên kết; thụt đầu dòng với 1, 2 và 3 không gian; sooo xấu xí. –

Trả lời

4

Vì low_rate và high_rate đều dương, bạn không thể nhận điểm âm. Bạn phải thay đổi:

#define LOW_RATE 0.01 

đến, ví dụ,

#define LOW_RATE -0.5 
+0

Wow, điều này làm việc như quyến rũ..Cảm ơn bạn rất nhiều. –