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; }
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); }
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; }