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
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* int	_MulDec80Bit(pDst,pSrc1,pSrc2);
 | 
						|
 *
 | 
						|
 * ARGUMENT
 | 
						|
 *	DEC	*pDst;
 | 
						|
 *	DEC	*pSrc1,pSrc2;
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *	Multiplies pSrc1 times pSrc2 and puts it into pDst.
 | 
						|
 *   pSrc1 and pSrc2 remain unchanged. Note that we always make
 | 
						|
 *   the number	with the fewest	non-zero 16-bit	int's the multiplier for
 | 
						|
 *   the low-level call. Additionally, if either number	is negative, it
 | 
						|
 *   is	temporarily converted a	positive for the mult. and a flag is set
 | 
						|
 *   to	convert	the answer if unlike signs.
 | 
						|
 *
 | 
						|
 * SIDE	EFFECTS
 | 
						|
 *	None.
 | 
						|
 *
 | 
						|
 * RETURNS
 | 
						|
 *	Returns	GM_SUCCESS if successful, otherwise the	error code.
 | 
						|
 *
 | 
						|
 * AUTHOR
 | 
						|
 *  Jared Levy
 | 
						|
 *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | 
						|
 *
 | 
						|
 * MODIFICATIONS
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include "gm.h"
 | 
						|
#include "gmsystem.h"
 | 
						|
 | 
						|
int	_MulDec80Bit(pDst,pSrc1,pSrc2)
 | 
						|
DEC	*pDst;
 | 
						|
DEC	*pSrc1,*pSrc2;
 | 
						|
{
 | 
						|
	register int	i,p;
 | 
						|
	int	r=0,stktmp=0;
 | 
						|
	unsigned SHORT dtp[10];
 | 
						|
 | 
						|
/*  First, if either of	the numbers is zero, the result	is alway zero */
 | 
						|
	if((_MacIsDecZ(pSrc1)) || (_MacIsDecZ(pSrc2)))	{
 | 
						|
		i = pSrc1->dc.id + pSrc2->dc.id;
 | 
						|
		_MacDZero(pDst);
 | 
						|
		pDst->dc.id = (i > GM_IMAXID) ?	GM_IMAXID : i;
 | 
						|
		return(GM_SUCCESS);
 | 
						|
		}
 | 
						|
 | 
						|
/*	Find out number	of 16-bit int's	in each	number */
 | 
						|
	i = 4;
 | 
						|
	while (	pSrc1->dc.sl[i]==0 && i>=0)
 | 
						|
	    i--;
 | 
						|
	p = 4;
 | 
						|
	while (	pSrc2->dc.sl[p]==0 && p>=0 )
 | 
						|
	    p--;
 | 
						|
 | 
						|
 | 
						|
	/* allow user to specify pDst as one of	the sources */
 | 
						|
	_MulUnsArrByUnsArr(pSrc1->dc.sl, pSrc2->dc.sl, dtp,
 | 
						|
		i+1,p+1,stktmp);
 | 
						|
 | 
						|
	/* squeeze eight digits	down to	four */
 | 
						|
	p=0;
 | 
						|
	while ((dtp[4] >= 500) || (dtp[5] != 0)	|| (dtp[6] != 0) ||
 | 
						|
		(dtp[7]	!= 0) || (dtp[8] != 0) || (dtp[9] != 0)) {
 | 
						|
		r = _DivUnsArrByUns(dtp, 10000,	10);
 | 
						|
		p+=4;
 | 
						|
		}
 | 
						|
 | 
						|
	if (!dtp[4] && dtp[3]<=32767)  {
 | 
						|
		if (r>=5000)
 | 
						|
			(void) _IncrementUnsArr(dtp);
 | 
						|
	}
 | 
						|
	else
 | 
						|
	if (dtp[4] >= 50)  {
 | 
						|
		_DivUnsArrByUnsRound(dtp, 1000,	5);
 | 
						|
		p+=3;
 | 
						|
		}
 | 
						|
	else
 | 
						|
	if (dtp[4] >= 5)  {
 | 
						|
		_DivUnsArrByUnsRound(dtp, 100, 5);
 | 
						|
		p+=2;
 | 
						|
		}
 | 
						|
	else  {
 | 
						|
		_DivUnsArrByUnsRound(dtp, 10, 5);
 | 
						|
		p++;
 | 
						|
	}
 | 
						|
/* now p is the	power of 10 which was divided */
 | 
						|
 | 
						|
	i = pSrc1->dc.id + pSrc2->dc.id	- p;
 | 
						|
	if (i <	GM_IMINID)
 | 
						|
		return(GM_OVERFLOW);
 | 
						|
	pDst->dc.sl[0] = dtp[0];
 | 
						|
	pDst->dc.sl[1] = dtp[1];
 | 
						|
	pDst->dc.sl[2] = dtp[2];
 | 
						|
	pDst->dc.sl[3] = dtp[3];
 | 
						|
	pDst->dc.sl[4] = dtp[4];
 | 
						|
 | 
						|
/*  if the signs of the	sources	are different, pDst=-pDst */
 | 
						|
	pDst->dc.attr =	(pSrc1->dc.attr^pSrc2->dc.attr);
 | 
						|
 | 
						|
	if (i >	GM_IMAXID)  {
 | 
						|
		_DivUnsArrByPwrOf10(pDst->dc.sl,
 | 
						|
			5, i - GM_IMAXID);
 | 
						|
		pDst->dc.id = GM_IMAXID;
 | 
						|
		return((_MacIsDecZ(pDst))? GM_UNDERFLOW	: GM_SUCCESS);
 | 
						|
		}
 | 
						|
 | 
						|
	pDst->dc.id = i;
 | 
						|
 | 
						|
	return(GM_SUCCESS);
 | 
						|
}
 |