Example #1
0
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 );
}
Example #2
0
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
}
Example #3
0
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 );
}
Example #4
0
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;
}