public static boolean fastSubtract( int leftSignum, long leftFast0, long leftFast1, long leftFast2, int leftIntegerDigitCount, int leftScale, int rightSignum, long rightFast0, long rightFast1, long rightFast2, int rightIntegerDigitCount, int rightScale, FastHiveDecimal fastResult) { if (rightSignum == 0) { fastResult.fastSet(leftSignum, leftFast0, leftFast1, leftFast2, leftIntegerDigitCount, leftScale); return true; } final int flippedDecSignum = (rightSignum == 1 ? -1 : 1); if (leftSignum == 0) { fastResult.fastSet(flippedDecSignum, rightFast0, rightFast1, rightFast2, rightIntegerDigitCount, rightScale); return true; } if (leftScale == rightScale) { return doAddSameScale( leftSignum, leftFast0, leftFast1, leftFast2, flippedDecSignum, rightFast0, rightFast1, rightFast2, leftScale, fastResult); } else { return doAddDifferentScale( leftSignum, leftFast0, leftFast1, leftFast2, leftIntegerDigitCount, leftScale, flippedDecSignum, rightFast0, rightFast1, rightFast2, rightIntegerDigitCount, rightScale, fastResult); } }
if (!doBinaryToDecimalConversion( lowerWord56, middleWord56, highWord56, FAST_HIVE_DECIMAL_TWO_POWER_56, return doAlternateSetFromBigIntegerBytesAndScale( bytes, startOffset, length, scale, fastResult); if (!doAddSameScaleSameSign( /* resultSignum */ 1, fastResult.fast0, fastResult.fast1, fastResult.fast2, return doAlternateSetFromBigIntegerBytesAndScale( bytes, startOffset, length, scale, fastResult); fastResult.fastSignum = (isNegative ? -1 : 1); fastResult.fastScale = scale; final int rawPrecision = fastRawPrecision(fastResult); fastResult.fastIntegerDigitCount = Math.max(0, rawPrecision - scale); fastTrailingDecimalZeroCount( fastResult.fast0, fastResult.fast1, fastResult.fast2, fastResult.fastIntegerDigitCount, fastResult.fastScale); if (resultTrailingZeroCount > 0) { doFastScaleDown( fastResult, resultTrailingZeroCount,
/** * Hash code based on (new) decimal representation. * * Faster than fastHashCode(). * * Used by map join and other Hive internal purposes where performance is important. * * IMPORTANT: See comments for fastHashCode(), too. * @param fastSignum the sign (-1, 0, or +1) * @param fast0 word 0 of the internal representation * @param fast1 word 1 * @param fast2 word 2 * @param fastIntegerDigitCount the number of integer digits * @param fastScale the scale of the number * @return the hash code */ public static int fastNewFasterHashCode( int fastSignum, long fast0, long fast1, long fast2, int fastIntegerDigitCount, int fastScale) { if (fastSignum == 0) { return ZERO_NEW_FASTER_HASH_CODE; } int hashCode = doCalculateNewFasterHashCode(fastSignum, fast0, fast1, fast2, fastIntegerDigitCount, fastScale); return hashCode; }
isRoundPortionAllZeroes( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
if (!doAddSameScaleSameSign( if (!fastRoundFractionalHalfUp( fastResult.fastSignum, fastResult.fast0, fastResult.fast1, fastResult.fast2, 1, fastCompareTo( 1, leftFast0, leftFast1, leftFast2, 0, if (!doSubtractSameScaleNoUnderflow( if (!doSubtractSameScaleNoUnderflow( final int precision = fastRawPrecision(fastResult); fastResult.fastIntegerDigitCount = Math.max(0, precision - fastResult.fastScale); fastTrailingDecimalZeroCount( fastResult.fast0, fastResult.fast1, fastResult.fast2, fastResult.fastIntegerDigitCount, fastResult.fastScale); if (resultTrailingZeroCount > 0) { doFastScaleDown( fastResult, resultTrailingZeroCount,
isRoundPortionHalfUp( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
isRoundPortionHalfEven( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, fastResult.fastSignum = 0; fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
if (!doDecimalToBinaryConversion( adjust0, adjust1, adjust2, FAST_HIVE_DECIMAL_TWO_POWER_63_INVERSE,
public static boolean doAddSameScaleSameSign( int resultSignum, long left0, long left1, long left2, long right0, long right1, long right2, FastHiveDecimal fastResult) { long result0; long result1; long result2; final long r0 = left0 + right0; result0 = r0 % MULTIPLER_LONGWORD_DECIMAL; final long r1 = left1 + right1 + r0 / MULTIPLER_LONGWORD_DECIMAL; result1 = r1 % MULTIPLER_LONGWORD_DECIMAL; result2 = left2 + right2 + r1 / MULTIPLER_LONGWORD_DECIMAL; if (result0 == 0 && result1 == 0 && result2 == 0) { fastResult.fastReset(); } else { fastResult.fastSignum = resultSignum; fastResult.fast0 = result0; fastResult.fast1 = result1;
return doCompareToSameScale( leftSignum, leftFast0, leftFast1, leftFast2,
if (!doAddSameScaleSameSign( if (!fastRoundFractionalHalfUp( fastResult.fastSignum, fastResult.fast0, fastResult.fast1, fastResult.fast2, 1, fastCompareTo( 1, leftFast0, leftFast1, leftFast2, 0, if (!doSubtractSameScaleNoUnderflow( if (!doSubtractSameScaleNoUnderflow( final int precision = fastRawPrecision(fastResult); fastResult.fastIntegerDigitCount = Math.max(0, precision - fastResult.fastScale); fastTrailingDecimalZeroCount( fastResult.fast0, fastResult.fast1, fastResult.fast2, fastResult.fastIntegerDigitCount, fastResult.fastScale); if (resultTrailingZeroCount > 0) { doFastScaleDown( fastResult, resultTrailingZeroCount,
isRoundPortionHalfUp( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
isRoundPortionHalfEven( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
isRoundPortionAllZeroes( fast0, fast1, fast2, roundingPoint); fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortionAndAddOne( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, } else { fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
fastResult.fast2 = fast2; } else { doFastScaleDown( fast0, fast1, fast2, doClearRoundIntegerPortion( fastResult.fast0, fastResult.fast1, fastResult.fast2, absRoundPower, fastResult.fastSignum = 0; fastResult.fastSignum = fastSignum; fastResult.fastIntegerDigitCount = fastRawPrecision(fastResult); fastResult.fastScale = 0;
if (!doDecimalToBinaryConversion( fast0, fast1, fast2, FAST_HIVE_DECIMAL_TWO_POWER_56_INVERSE,
public static boolean doAddSameScaleSameSign( int resultSignum, long left0, long left1, long left2, long right0, long right1, long right2, FastHiveDecimal fastResult) { long result0; long result1; long result2; final long r0 = left0 + right0; result0 = r0 % MULTIPLER_LONGWORD_DECIMAL; final long r1 = left1 + right1 + r0 / MULTIPLER_LONGWORD_DECIMAL; result1 = r1 % MULTIPLER_LONGWORD_DECIMAL; result2 = left2 + right2 + r1 / MULTIPLER_LONGWORD_DECIMAL; if (result0 == 0 && result1 == 0 && result2 == 0) { fastResult.fastReset(); } else { fastResult.fastSignum = resultSignum; fastResult.fast0 = result0; fastResult.fast1 = result1;
return doCompareToSameScale( leftSignum, leftFast0, leftFast1, leftFast2,
if (!doBinaryToDecimalConversion( lowerWord63, middleWord63, highWord63, FAST_HIVE_DECIMAL_TWO_POWER_62, if (!doAddSameScaleSameSign( /* resultSignum */ 1, fastResult.fast0, fastResult.fast1, fastResult.fast2, } else { fastResult.fastSignum = (isNegative ? -1 : 1); final int rawPrecision = fastRawPrecision(fastResult); fastResult.fastIntegerDigitCount = Math.max(0, rawPrecision - scale); fastResult.fastScale = scale; fastTrailingDecimalZeroCount( fastResult.fast0, fastResult.fast1, fastResult.fast2, fastResult.fastIntegerDigitCount, fastResult.fastScale); if (resultTrailingZeroCount > 0) { doFastScaleDown( fastResult, resultTrailingZeroCount,