Files correlati : gfm.dll Ricompilazione Demo : [ ] Commento : Modifiche per la compilazione Linux git-svn-id: svn://10.65.10.50/trunk@11079 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* DEC	*ConvDoubleToDecimal( x, f)
 | 
						|
 *
 | 
						|
 * ARGUMENT
 | 
						|
 *	DEC	*x;
 | 
						|
 *	double	f;
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *	Converts a double to a DEC with	maximum	implied	decimal.  Uses
 | 
						|
 * eTwoTo32 (2^32), eTwoTo63 (2^63), and ergGMPowersOfTenDouble
 | 
						|
 *  (powers of ten), all global	double variables.
 | 
						|
 *
 | 
						|
 * SIDE	EFFECTS
 | 
						|
 *	None.
 | 
						|
 *
 | 
						|
 * RETURNS
 | 
						|
 *	The DEC	if the conversion is successful, and GM_NULL otherwise.
 | 
						|
 *
 | 
						|
 * POSSIBLE ERROR CODES
 | 
						|
 *
 | 
						|
 *	GM_NOMEMORY
 | 
						|
 *	GM_CNVRE
 | 
						|
 *
 | 
						|
 * AUTHOR
 | 
						|
 *   Jared Levy		Feb. 9,	1987
 | 
						|
 *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | 
						|
 *
 | 
						|
 * MODIFICATIONS
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include "gm.h"
 | 
						|
#include "gmsystem.h"
 | 
						|
#include "math.h"
 | 
						|
 | 
						|
DEC	*ConvDoubleToDecimal( x, f)
 | 
						|
DEC	*x;
 | 
						|
double	f;
 | 
						|
 | 
						|
{
 | 
						|
	int	nid;
 | 
						|
	mbool	wfIsNeg=FALSE;
 | 
						|
	double	g;
 | 
						|
 | 
						|
	_MacStart(GM_DFTOD);
 | 
						|
	_MacOutVarD(x);
 | 
						|
 | 
						|
/* take	absolute value of negative values */
 | 
						|
	if (f<0.0) {
 | 
						|
		wfIsNeg	= TRUE;
 | 
						|
		f = -f;
 | 
						|
		}
 | 
						|
 | 
						|
/* f = 0 */
 | 
						|
	if (f == 0.0)  {
 | 
						|
		_MacDZero(x);
 | 
						|
		_MacRet(x);
 | 
						|
		}
 | 
						|
 | 
						|
/* overflow & underflow	(MAXID = 18, MINID = 0)	*/
 | 
						|
	if ((f>=eTwoTo63) || (f<.5e-18))  {
 | 
						|
		if (x)
 | 
						|
			_MacDZero(x);
 | 
						|
		_MacErr(GM_CNVRE);
 | 
						|
		_MacRet(GM_NULL);
 | 
						|
		}
 | 
						|
 | 
						|
/* take	absolute value of negative values */
 | 
						|
	if (f<0.0) {
 | 
						|
		wfIsNeg	= TRUE;
 | 
						|
		f = -f;
 | 
						|
		}
 | 
						|
 | 
						|
	_MacDZero(x);
 | 
						|
 | 
						|
/* calculate implied decimal of	DEC */
 | 
						|
	g = eTwoTo63/f;
 | 
						|
	nid = 0;
 | 
						|
	while ((nid <= 17) && (ergGMPowersOfTenDouble[nid+1] <=	g))
 | 
						|
		nid++;
 | 
						|
 | 
						|
/* adjust by power of 10 */
 | 
						|
	f = f *	ergGMPowersOfTenDouble[nid];
 | 
						|
 | 
						|
/* add .5 to round rather than truncate	*/
 | 
						|
	f+= 0.5;
 | 
						|
 | 
						|
/* change float	to 64 bit integer */
 | 
						|
	if (f >= eTwoTo32 - 1)	{
 | 
						|
#ifdef ZORTECH
 | 
						|
		if ( (f	/ eTwoTo32) > eTwoTo31 ) {
 | 
						|
		    x->ls.lsl[1] = (unsigned long) ((f / eTwoTo32) - eTwoTo31 );
 | 
						|
		    x->ls.lsl[1] += (unsigned long) eTwoTo31;
 | 
						|
		} else
 | 
						|
		    x->ls.lsl[1] = (unsigned long) (f /	eTwoTo32);
 | 
						|
#else
 | 
						|
		x->ls.lsl[1] = (unsigned long) (f / eTwoTo32);
 | 
						|
#endif
 | 
						|
		g = (double) x->ls.lsl[1];
 | 
						|
		f-= g *	eTwoTo32;
 | 
						|
		while (f<0.0)  {
 | 
						|
			x->ls.lsl[1]--;
 | 
						|
			f+= eTwoTo32;
 | 
						|
			}
 | 
						|
		while (f>= eTwoTo32)  {
 | 
						|
			x->ls.lsl[1]++;
 | 
						|
			f-= eTwoTo32;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	else
 | 
						|
		x->ls.lsl[1] = 0;
 | 
						|
 | 
						|
#ifdef ZORTECH
 | 
						|
       if ( f >	eTwoTo31 ) {
 | 
						|
	   x->ls.lsl[0]	= f - eTwoTo31;
 | 
						|
	   x->ls.lsl[0]	+= (unsigned long) eTwoTo31;
 | 
						|
       } else
 | 
						|
	   x->ls.lsl[0]	= (unsigned long) f;
 | 
						|
#else
 | 
						|
	x->ls.lsl[0] = (unsigned long) f;
 | 
						|
#endif
 | 
						|
	x->ls.lid = nid;
 | 
						|
	x->dc.msd = 0;	/* msd can't be	set either */
 | 
						|
 | 
						|
	if (wfIsNeg) {
 | 
						|
		_MacDChgs(x);
 | 
						|
	}
 | 
						|
 | 
						|
	_MacRet(x);
 | 
						|
}
 |