Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunti i sorgenti per Greenleaf Math Library (gfm.dll) git-svn-id: svn://10.65.10.50/trunk@10079 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* DEC	*_SimpleAux(ndays,intr,princ,intamt,opt,diy)
 | |
|  *
 | |
|  * ARGUMENT
 | |
|  *	int	*ndays;		number of days
 | |
|  *	DEC	*intr;			annual interest	rate
 | |
|  *	DEC	*princ;			principal amount
 | |
|  *	DEC	*intamt			accrued	interest amount
 | |
|  *	int	opt;			variable to solve for
 | |
|  *	int	diy;			days in	year (360 or 365)
 | |
|  *
 | |
|  * DESCRIPTION
 | |
|  *	Give three of the above	variables, solves for the fourth.  opt is
 | |
|  *   either GM_N, GM_I,	GM_PV, or GM_INTR, according to	the variable to	solve
 | |
|  *   for.  Three source	pointers are inputs, the fourth	is the destination
 | |
|  *   pointer.  princ and intamt	are rounded to 2 decimal places, ndays is
 | |
|  *   rounded up	to an integer, and intr	is calculated to maximum precision.
 | |
|  *	This function does the calculations for	SimpleInterest360 &
 | |
|  *   SimpleInterest365.
 | |
|  *
 | |
|  * SIDE	EFFECTS
 | |
|  *	If successful, the output pointer is modified, otherwise none.
 | |
|  *	error flag is set in this routine.
 | |
|  *
 | |
|  * RETURNS
 | |
|  *	variable if successful,	otherwise GM_NULL.
 | |
|  *
 | |
|  * POSSIBLE ERRORS
 | |
|  *	GM_NULLPOINTER
 | |
|  *	GM_ARGVAL
 | |
|  *
 | |
|  * ALGORITHM
 | |
|  *	intrate	= princ	* intr * ndays / (100 *	diy)
 | |
|  *
 | |
|  * AUTHOR
 | |
|  *  Jared Levy
 | |
|  *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | |
|  *
 | |
|  * MODIFICATIONS
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "gm.h"
 | |
| #include "gmsystem.h"
 | |
| 
 | |
| DEC	*_SimpleAux(ndays,intr,princ,intamt,opt,diy)
 | |
| int	*ndays;
 | |
| DEC	*intr;
 | |
| DEC	*princ;
 | |
| DEC	*intamt;
 | |
| int	opt;
 | |
| int	diy;
 | |
| {
 | |
| 	DEC	dday, *day=&dday, dhdiy, *hdiy=&dhdiy;
 | |
| 	DEC	dtemp, *temp=&dtemp, dt2, *t2=&dt2;
 | |
| 
 | |
| /* check for invalid opt */
 | |
| 	if ((opt!=GM_N)	&& (opt!=GM_I) && (opt!=GM_PV) && (opt!=GM_INTR)) {
 | |
| 		_MacErr(GM_ARGVAL);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 
 | |
| /* check for null pointers */
 | |
| 	if (!ndays || !intr || !princ || !intamt)  {
 | |
| 		_MacErr(GM_NULLPOINTER);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 	if ((opt!=GM_I&&_MacBad(intr)) || (opt!=GM_PV&&_MacBad(princ))
 | |
| 		|| (opt!=GM_INTR&&_MacBad(intr)))  {
 | |
| 		_MacErr(GM_INIT);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 
 | |
| /* change ndays	to DEC */
 | |
| 	if (opt!=GM_N)
 | |
| 		(void) ConvLongToDecimal(day, (long) *ndays);
 | |
| 
 | |
| 	(void) ConvLongToDecimal(hdiy, 100L * (long) diy);
 | |
| 
 | |
| /* solved for interest accrued */
 | |
| 	if (opt==GM_INTR)  {
 | |
| 		(void) _MulDec80Bit(temp, princ, intr);
 | |
| 		(void) _MulDec80Bit(temp, temp,	day);
 | |
| 		(void) _DivRndDec80Bit(intamt, temp, hdiy, 2);
 | |
| 		return(intamt);
 | |
| 	}
 | |
| 
 | |
| /* check for zero variables */
 | |
| 	if ((opt!=GM_N)	&& (*ndays==0))	 {
 | |
| 		_MacErr(GM_ARGVAL);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 
 | |
| 	if ((opt!=GM_I)	&& _MacIsDecZ(intr))  {
 | |
| 		_MacErr(GM_ARGVAL);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 
 | |
| 	if ((opt!=GM_PV) && _MacIsDecZ(princ))	{
 | |
| 		_MacErr(GM_ARGVAL);
 | |
| 		return(GM_NULL);
 | |
| 	}
 | |
| 
 | |
| /* solve for principal */
 | |
| 	if (opt==GM_PV)	 {
 | |
| 		(void) _MulDec80Bit(temp, intamt, hdiy);
 | |
| 		(void) _DivDec80Bit(temp, temp,	intr);
 | |
| 		(void) _DivRndDec80Bit(princ, temp, day, 2);
 | |
| 		return(princ);
 | |
| 	}
 | |
| 
 | |
| /* solve for interest rate */
 | |
| 	if (opt==GM_I)	{
 | |
| 		(void) _MulDec80Bit(temp, intamt, hdiy);
 | |
| 		(void) _DivDec80Bit(temp, temp,	princ);
 | |
| 		(void) _DivDec80Bit(intr, temp,	day);
 | |
| 		(void) _Sq5UnsTo4Uns(intr);
 | |
| 		return(intr);
 | |
| 	}
 | |
| 
 | |
| /* solve for number of days */
 | |
| /*	if (opt==GM_N)	*/
 | |
| 		(void) _MulDec80Bit(temp, intamt, hdiy);
 | |
| 		(void) _DivDec80Bit(temp, temp,	intr);
 | |
| 		(void) _DivDec80Bit(temp, temp,	princ);
 | |
| 		(void) _TruncateDec80Bit(t2, temp, 0);
 | |
| 		if (!CompareDecimal(t2,	temp)==0)
 | |
| 			_AddDec80Bit(t2, t2, &decOne);
 | |
| 		if (t2->dc.sl[1] || _MacIsDecN(t2) || (t2->dc.sl[0]&0x8000)
 | |
| 			|| t2->dc.sl[2]	|| t2->dc.sl[3]	|| t2->dc.msd)	{
 | |
| 				_MacErr(GM_ARGVAL);
 | |
| 				return(GM_NULL);
 | |
| 			}
 | |
| 			*ndays = (int) t2->dc.sl[0];
 | |
| 		return(GM_NULL);
 | |
| 
 | |
| }
 |