160 lines
5.5 KiB
C
160 lines
5.5 KiB
C
/**************************************************************************\
|
|
* *
|
|
* *
|
|
* *
|
|
* # # ##### *
|
|
* # # # # # *
|
|
* # # # # # # # *
|
|
* # ### ### # # *
|
|
* # # ### # # # ### # # ### ##### # ### ### ### *
|
|
* # ## # # # ## # # # # # # ## # # # *
|
|
* # # # # # # # # # ##### # # ##### # *
|
|
* # # # # # # # # # # # # # # ## *
|
|
* # # # # # # # # # ### # # ### ### ## *
|
|
* *
|
|
* *
|
|
* Infinte Precision Production Version *
|
|
* *
|
|
\**************************************************************************/
|
|
//
|
|
// RETAIL version of NUMOBJ math that uses Infinite Precision
|
|
//
|
|
#include "..\ratpak\ratpak.h"
|
|
|
|
#define HNUMOBJ PRAT
|
|
typedef HNUMOBJ * PHNUMOBJ;
|
|
|
|
|
|
//
|
|
// Memory Alloc functions
|
|
//
|
|
#define NumObjAllocMem( cb ) zmalloc( cb )
|
|
#define NumObjFreeMem( h ) zfree( h ),(h=NULL)
|
|
|
|
//
|
|
// Unary functions
|
|
//
|
|
|
|
void NumObjInvert( PHNUMOBJ phno );
|
|
|
|
#define NumObjNegate( phno ) ( ((PRAT)*phno)->pp->sign= -(((PRAT)*phno)->pp->sign) )
|
|
#define NumObjAbs( phno ) ( ((PRAT)*phno)->pp->sign=1, ((PRAT)*phno)->pq->sign=1 )
|
|
|
|
extern void NumObjSin( PHNUMOBJ phno );
|
|
extern void NumObjCos( PHNUMOBJ phno );
|
|
extern void NumObjTan( PHNUMOBJ phno );
|
|
extern void NumObjAntiLog10( PHNUMOBJ phno );
|
|
|
|
extern void NumObjNot( PHNUMOBJ phno );
|
|
|
|
//
|
|
// Comparison functions
|
|
//
|
|
#define NumObjIsZero( hno ) zerrat( hno )
|
|
#define NumObjIsLess( hno1, hno2 ) rat_lt( hno1, hno2 )
|
|
#define NumObjIsLessEq( hno1, hno2 ) rat_le( hno1, hno2 )
|
|
#define NumObjIsGreaterEq( hno1, hno2 ) rat_ge( hno1, hno2 )
|
|
#define NumObjIsEq( hno1, hno2 ) rat_equ(hno1, hno2 )
|
|
|
|
//
|
|
// Assignment operator. ('=' in C language)
|
|
//
|
|
#define NumObjAssign( phnol, hnor ) if (1) { DUPRAT( (*phnol), hnor ); } else
|
|
|
|
|
|
//
|
|
// Data type conversion functions
|
|
//
|
|
void NumObjSetIntValue( PHNUMOBJ phnol, LONG i );
|
|
|
|
|
|
//
|
|
// NumObjMakeNumber
|
|
//
|
|
// HNUMOBJ NumObjMakeNumber( LPTSTR psz );
|
|
//
|
|
// Converts psz to a number and returns it. Call NumObjDestroy()
|
|
// when you are done using the returned NumObj.
|
|
//
|
|
#define NumObjMakeNumber( fMantNeg, pszMant, fExpNeg, pszExp ) inrat( fMantNeg, pszMant, fExpNeg, pszExp )
|
|
|
|
//
|
|
// NumObjGetSzValue
|
|
//
|
|
// void NumObjGetSzValue( LPTSTR *ppszNum, HNUMOBJ hnoNum, INT nRadix, NUMOBJ_FMT gafmt );
|
|
//
|
|
// Converts hnoNum to a string and places the pointer into *ppszNum. If *ppszNum already points
|
|
// to a string, then that string is freed.
|
|
//
|
|
// NOTES: *ppszNum must either be NULL or point to a string previously returned by this function!
|
|
// If you wish to free the string without replacing it. You MUST use the NumObjFreeMem() function!
|
|
//
|
|
void NumObjGetSzValue( LPTSTR *ppszNum, HNUMOBJ hnoNum, INT nRadix, NUMOBJ_FMT gafmt );
|
|
|
|
//
|
|
// GetObjGetExp
|
|
//
|
|
// returns an int that equals the exponent of the NumObj
|
|
//
|
|
#define NumObjGetExp( hno ) LOGRATRADIX(hno)
|
|
|
|
//
|
|
// NumObjCvtEpsilonToZero
|
|
//
|
|
// if the input is < 1*10^(-nPrecision), then it gets set to zero
|
|
// useful for special cases in ln, log, and sin, and cos
|
|
//
|
|
#define NumObjCvtEpsilonToZero( phno )
|
|
//#define NumObjCvtEpsilonToZero( phno ) if ( NumObjGetExp( *phno ) <= -nPrecision ) { NumObjAssign( phno, HNO_ZERO );} else
|
|
|
|
//
|
|
// NumObjAbortOperation( fAbort )
|
|
//
|
|
// If called with fAbort==TRUE, it will cause RATPAK to abort the current calculation and to return
|
|
// immeadiatly.
|
|
//
|
|
// It MUST be called again with fAbort=FALSE after ratpak has aborted to reset ratpak.
|
|
//
|
|
#define NumObjAbortOperation( fAbort ) (fhalt=fAbort)
|
|
#define NumObjWasAborted() (fhalt)
|
|
|
|
//
|
|
// NumObjOK( hno )
|
|
//
|
|
// returns TRUE if the HNUMOBJ is valid (ie created and initialized)
|
|
//
|
|
// Used to check the HNUMOBJ returned from NumObjMakeNumber and NumObjCreate
|
|
//
|
|
# define NumObjOK( hno ) ((hno) == NULL ? FALSE : TRUE)
|
|
|
|
//
|
|
// NumObjDestroy( hno )
|
|
//
|
|
// call this when you nolonger need the NumObj. Failure to do so
|
|
// will result in memory leaks.
|
|
//
|
|
# define NumObjDestroy( phno ) destroyrat( (*(phno)) )
|
|
|
|
//
|
|
// DECLARE_HNUMOBJ( hno )
|
|
//
|
|
// Use this macro when ever you want to declare a local variable.
|
|
//
|
|
# define DECLARE_HNUMOBJ( hno ) HNUMOBJ hno = NULL
|
|
|
|
//
|
|
// Useful Constants. These have to be recomputed after a base or precision change.
|
|
//
|
|
void BaseOrPrecisionChanged( void );
|
|
|
|
#define HNO_ZERO rat_zero
|
|
#define HNO_ONE_OVER_TWO rat_half
|
|
#define HNO_ONE rat_one
|
|
#define HNO_TWO rat_two
|
|
#define HNO_180_OVER_PI rad_to_deg
|
|
#define HNO_200_OVER_PI rad_to_grad
|
|
#define HNO_2PI two_pi
|
|
#define HNO_PI pi
|
|
#define HNO_PI_OVER_TWO pi_over_two
|
|
#define HNO_THREE_PI_OVER_TWO one_pt_five_pi
|