GnmValue * get_yieldmat (GDate *nSettle, GDate *nMat, GDate *nIssue, gnm_float fRate, gnm_float fPrice, gint nBase) { gnm_float fIssMat = yearfrac ( nIssue, nMat, nBase ); gnm_float fIssSet = yearfrac ( nIssue, nSettle, nBase ); gnm_float fSetMat = yearfrac ( nSettle, nMat, nBase ); gnm_float y = 1.0 + fIssMat * fRate; y /= fPrice / 100.0 + fIssSet * fRate; y--; y /= fSetMat; return value_new_float ( y ); }
GnmValue * get_amordegrc (gnm_float fCost, GDate *nDate, GDate *nFirstPer, gnm_float fRestVal, gint nPer, gnm_float fRate, gint nBase) { gint n; gnm_float fAmorCoeff, fNRate, fRest, fUsePer; #define Round(x,y) (gnm_floor ((x) + 0.5)) fUsePer = 1.0 / fRate; if (fUsePer < 3.0) fAmorCoeff = 1.0; else if (fUsePer < 5.0) fAmorCoeff = 1.5; else if (fUsePer <= 6.0) fAmorCoeff = 2.0; else fAmorCoeff = 2.5; fRate *= fAmorCoeff; fNRate = Round ( yearfrac( nDate, nFirstPer, nBase ) * fRate * fCost, 0 ); fCost -= fNRate; fRest = fCost - fRestVal; for ( n = 0 ; n < nPer ; n++ ) { fNRate = Round ( fRate * fCost, 0 ); fRest -= fNRate; if ( fRest < 0.0 ) { switch ( nPer - n ) { case 0: case 1: return value_new_float (Round ( fCost * 0.5, 0 ) ); default: return value_new_float (0.0); } } fCost -= fNRate; } return value_new_float (fNRate); #undef Round }
GnmValue * get_amorlinc (gnm_float fCost, GDate *nDate, GDate *nFirstPer, gnm_float fRestVal, gint nPer, gnm_float fRate, gint nBase) { gnm_float fOneRate = fCost * fRate; gnm_float fCostDelta = fCost - fRestVal; gnm_float f0Rate = yearfrac ( nDate, nFirstPer, nBase ) * fRate * fCost; gint nNumOfFullPeriods = (fCost - fRestVal - f0Rate) / fOneRate; gnm_float result; if ( nPer == 0 ) result = f0Rate; else if( nPer <= nNumOfFullPeriods ) result = fOneRate; else if( nPer == nNumOfFullPeriods + 1 ) result = fCostDelta - fOneRate * nNumOfFullPeriods - f0Rate; else result = 0.0; return value_new_float ( result ); }
BOOL EVAL::EvalFunction(INT nFunction, INT argc, double * argv, double * pValue) { switch( nFunction ) { case EVAL_FUNCTION_ABS: if( argc == 1 ) { * pValue = fabs( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_MOD: if( argc == 2 ) { * pValue = fmod( argv[0], argv[1] ); return TRUE; } break; case EVAL_FUNCTION_CEIL: if( argc == 1 ) { * pValue = ceil( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_FLOOR: if( argc == 1 ) { * pValue = floor( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_ROUND: if( argc == 1 ) { * pValue = floor( argv[0] + 0.5 ); return TRUE; } break; case EVAL_FUNCTION_MIN: if( argc == 2 ) { * pValue = argv[0] < argv[1] ? argv[0] : argv[1]; return TRUE; } break; case EVAL_FUNCTION_MAX: if( argc == 2 ) { * pValue = argv[0] > argv[1] ? argv[0] : argv[1]; return TRUE; } break; case EVAL_FUNCTION_ACOS: if( argc == 1 ) { * pValue = acos(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ASIN: if( argc == 1 ) { * pValue = asin(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ATAN: if( argc == 1 ) { * pValue = atan(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ATAN2: if( argc == 2 ) { * pValue = atan2(argv[0], argv[1]); return TRUE; } break; case EVAL_FUNCTION_COS: if( argc == 1 ) { * pValue = cos(argv[0]); return TRUE; } break; case EVAL_FUNCTION_SIN: if( argc == 1 ) { * pValue = sin(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TAN: if( argc == 1 ) { * pValue = tan(argv[0]); return TRUE; } break; case EVAL_FUNCTION_COSH: if( argc == 1 ) { * pValue = cosh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_SINH: if( argc == 1 ) { * pValue = sinh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TANH: if( argc == 1 ) { * pValue = tanh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_EXP: if( argc == 1 ) { * pValue = exp(argv[0]); return TRUE; } break; case EVAL_FUNCTION_LOG: if( argc == 1 ) { * pValue = log(argv[0]); return TRUE; } break; case EVAL_FUNCTION_LOG10: if( argc == 1 ) { * pValue = log10(argv[0]); return TRUE; } break; case EVAL_FUNCTION_POW: if( argc == 2 ) { * pValue = pow(argv[0], argv[1]); return TRUE; } break; case EVAL_FUNCTION_SQR: if( argc == 1 ) { * pValue = argv[0] * argv[0]; return TRUE; } break; case EVAL_FUNCTION_SQRT: if( argc == 1 ) { * pValue = sqrt(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TODAY: if( argc == 0 ) { * pValue = (double)today(); return TRUE; } break; case EVAL_FUNCTION_YEARDAYS: if( argc == 1 ) { * pValue = (double)yeardays((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_MONTHDAYS: if( argc == 2 ) { * pValue = (double)monthdays((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DATE2DAYS: if( argc == 1 ) { * pValue = (double)date2days((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_DAYS2DATE: if( argc == 1 ) { * pValue = (double)days2date((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_EOMDAY: if( argc == 2 ) { * pValue = (double)eomday((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_EOMDATE: if( argc == 2 ) { * pValue = (double)eomdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_WEEKDAY: if( argc == 1 ) { * pValue = (double)weekday((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_ISBIZDATE: if( argc == 1 ) { * pValue = (double)isbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)isbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_NBIZDATE: if( argc == 1 ) { * pValue = (double)nbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)nbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_PBIZDATE: if( argc == 1 ) { * pValue = (double)pbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)pbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_ADDDAYS: if( argc == 2 ) { * pValue = (double)adddays((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_ADDMONTHS: if( argc == 2 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], EMR_ACTUAL ); return TRUE; } if( argc == 3 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_ADDTERMS: if( argc == 3 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; } break; case EVAL_FUNCTION_DAYS360: if( argc == 2 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], 0 /* USA */ ); return TRUE; } if( argc == 3 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_DAYS365: if( argc == 2 ) { * pValue = (double)days365((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DAYSACT: if( argc == 2 ) { * pValue = (double)daysact((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DAYSBET: if( argc == 2 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], DCB_ACTACT ); return TRUE; } if( argc == 3 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_MONTHSBET: if( argc == 2 ) { * pValue = (double)monthsbet((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_TERMSBET: if( argc == 3 ) { * pValue = (double)termsbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_TERMFRAC: if( argc == 3 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], DCB_ACTACT, EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], EMR_ACTUAL ); return TRUE; } if( argc == 5 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], (int)argv[4]); return TRUE; } break; case EVAL_FUNCTION_YEARFRAC: if( argc == 2 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], DCB_ACTACT, EMR_ACTUAL ); return TRUE; } if( argc == 3 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; } break; } return FALSE; }