Hi,
I need to pass around a decNumber encoded in an unsigned 64 bit integer so currently I'm using the following code...
decNumber value;
decContext context;
..... decContextDefault and so on.......
// encode
decimal64 d64;
unsigned long long encodedFD;
decimal64FromNumber( &d64, &value, &context );
memcpy( &encodedFD, &d64, sizeof(unsigned long long) );
// decode
decimal64 d64;
memcpy( &d64, &encodedFD, sizeof(unsigned long long) );
decimal64ToNumber( &d64, &value )
In addition, I have to often initialise a decNumber from a separately supplied coefficient and exponent, e.g. (123456, 3) => 123.456
Currently I do it like so... (some error handling code etc ommited)
decNumber value;
decContext context;
decContextDefault( &context, DEC_INIT_BASE );
context.traps = 0;
if ( coefficient == 0 )
{
decNumberZero( &value );
}
// values that fit in 32 bits can be handled by decNumberFromInt32
else if ( ( coefficient <= LONG_MAX ) && ( coefficient >= LONG_MIN ) )
{
decNumberFromInt32( &value, coefficient );
if ( exponent != 0 )
{
decNumber numExponent;
decNumberFromInt32( &numExponent, -exponent );
decNumberScaleB( &value, &value, &numExponent, &context );
}
}
// larger values use string conversion routines
else
{
char buff[DECNUMBER_BUFFSIZE];
decNumberFromString( &value, lltoa(buff, coefficient), &context );
if ( exponent != 0 )
{
// raise 10 to the power of -exponent
decNumber thePow, ten;
... set thePow to -exponent ...
... set ten to 10 ...
decNumberPower( &ten, &ten, thePow, &context );
decNumberMultiply( &value, &value, &ten, &context );
}
}
Simply put, is there a faster or better way to do this?
thanks,
James