예제 #1
0
bool DecimalDecNumber::toDecimalComponents(const DecimalDecNumber &val, int64& significand, int32& exponent)
{
	DecimalDecNumber valCopy = val;
	valCopy.m_context.digits = 18; // maximum number of digits which can be represented by int64 significand

	// Check if decimal is NaN or infinite - we can't represent these as components
	if (decNumberIsSpecial( &valCopy.m_value ))
	{
		exponent = 0;
		significand = 0;
		return false;
	}

	// Minimize the size of the number the significand needs to represent
	decNumberReduce( &valCopy.m_value, &valCopy.m_value, &valCopy.m_context );

	exponent = valCopy.m_value.exponent;

	decNumber numExponent;
	decNumberFromInt32( &numExponent, -valCopy.m_value.exponent );
	decNumberScaleB( &valCopy.m_value, &valCopy.m_value, &numExponent, &valCopy.m_context );

	if (::sscanf(valCopy.toString(0).c_str(), "%lld", &significand) != 1)
	{
		exponent = 0;
		significand = 0;
		return false;
	}

	return true;
}
예제 #2
0
void* decSingleScaleB (decSingle* _0, const decSingle* _1, const decSingle* _2, decContext* ctx) noexcept
{
  decNumber _0num;
  decNumber _1num;
  decNumber _2num;
  decSingleToNumber (_1, &_1num);
  decSingleToNumber (_2, &_2num);
  decNumberScaleB (&_0num, &_1num, &_2num, ctx);
  return decSingleFromNumber (_0, &_0num, ctx);
}
예제 #3
0
DecimalDecNumber DecimalDecNumber::fromDecimalComponents(const int64 significand, const int32 exponent)
{
	DecimalDecNumber number(significand);
	if ( exponent != 0 )
	{
		decNumber numExponent;
		decNumberFromInt32( &numExponent, exponent );
		decNumberScaleB( &number.m_value, &number.m_value, &numExponent, &number.m_context );
	}
	return number;
}