mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.8 KiB
120 lines
2.8 KiB
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include "imports.h"
|
|
|
|
#if DBG
|
|
|
|
#define printf DbgPrint
|
|
|
|
static void printNormalFloat( float fval )
|
|
{
|
|
int logi, logval_i, logval_f;
|
|
float logval, logf;
|
|
int negative=0;
|
|
|
|
if( fval < (float) 0.0 )
|
|
negative = 1;
|
|
fval = __GL_ABSF(fval);
|
|
|
|
logval = (float) (log( fval ) / log( 10 ));
|
|
|
|
logi = (int) logval;
|
|
logf = logval - logi;
|
|
|
|
if( (logval <= (float) 0) && (logf != (float) 0.0) ) {
|
|
logi -= 1;
|
|
logf += (float) 1.0;
|
|
}
|
|
logval = (float) pow(10,logf);
|
|
if( negative )
|
|
printf( "-" );
|
|
#if 0
|
|
printf( "%fE%d", logval, logi );
|
|
#else
|
|
logval_i = (int) logval;
|
|
logval_f = (int) ((logval - (float) logval_i) * (float) 10000.0 + (float) 0.5);
|
|
printf( "%d.%dE%d", logval_i, logval_f, logi );
|
|
#endif
|
|
}
|
|
|
|
void printFloat( char *comment, void *mval, int printHex )
|
|
{
|
|
// IEEE single format: sign bits : 1
|
|
// exponent : 7
|
|
// fraction : 24
|
|
// Representation: low word : Fraction low
|
|
// high word : 0-6: Fraction high
|
|
// 7-14: Exponent
|
|
// 15: Sign
|
|
char *ploww, *phighw;
|
|
short loww, highw;
|
|
long lval = 0, fraction;
|
|
int sign, exponent;
|
|
float fval;
|
|
|
|
ploww = (char *) mval;
|
|
phighw = (char *) ((char *) mval) + 2;
|
|
memcpy( &loww, ploww, 2 );
|
|
memcpy( &highw, phighw, 2 );
|
|
memcpy( &lval, mval, 4 );
|
|
|
|
sign = (highw & 0x8000) >> 15;
|
|
fraction = lval & 0x007fffff;
|
|
exponent = (highw & 0x7f80) >> 7;
|
|
|
|
printf( "%s", comment );
|
|
if( printHex )
|
|
printf( "0x%x, ", lval );
|
|
if( exponent == 255 ) {
|
|
if( fraction == 0 ) {
|
|
if( sign )
|
|
printf( "-" );
|
|
printf( "infinity" );
|
|
}
|
|
else
|
|
printf( "NaN" );
|
|
}
|
|
else if( exponent == 0 ) {
|
|
if( fraction == 0 )
|
|
printf( "0.0" );
|
|
else {
|
|
memcpy( &fval, mval, 4 );
|
|
printNormalFloat( fval );
|
|
}
|
|
}
|
|
else {
|
|
memcpy( &fval, mval, 4 );
|
|
printNormalFloat( fval );
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************\
|
|
* DbgPrintFloat
|
|
*
|
|
* Prints floating point numbers from within server, in exponent notation with
|
|
* 4 significant digits (e.g 1.7392E-23). Also prints string preceeding number.
|
|
* Checks for deviant cases, such as NaN's or infinity.
|
|
*
|
|
\*****************************************************************************/
|
|
|
|
void DbgPrintFloat( char *comment, float fval )
|
|
{
|
|
printFloat( comment, &fval, 0 );
|
|
}
|
|
|
|
/*****************************************************************************\
|
|
* DbgPrintFloatP
|
|
*
|
|
* Same as DbgPrintFloat, but takes a pointer to the float to print. Also
|
|
* prints out the hex representation of the float.
|
|
* Used in cases where the float may not be a valid float.
|
|
*
|
|
\*****************************************************************************/
|
|
|
|
void DbgPrintFloatP( char *comment, void *mval )
|
|
{
|
|
printFloat( comment, mval, 1 );
|
|
}
|
|
|
|
#endif // DBG
|