Class NumberMath
- java.lang.Object
- 
- org.codehaus.groovy.runtime.typehandling.NumberMath
 
- 
- Direct Known Subclasses:
- BigDecimalMath,- BigIntegerMath,- FloatingPointMath,- IntegerMath,- LongMath
 
 public abstract class NumberMath extends java.lang.ObjectStateless objects used to perform math on the various Number subclasses. Instances are required so that polymorphic calls work properly, but each subclass creates a singleton instance to minimize garbage. All methods must be thread-safe. The design goals of this class are as follows:- Support a 'least surprising' math model to scripting language users. This means that exact, or decimal math should be used for default calculations. This scheme assumes that by default, groovy literals with decimal points are instantiated as BigDecimal objects rather than binary floating points (Float, Double).
- Do not force the appearance of exactness on a number that is by definition not guaranteed to be exact. In particular this means that if an operand in a NumberMath operation is a binary floating point number, ensure that the result remains a binary floating point number (i.e. never automatically promote a binary floating point number to a BigDecimal). This has the effect of preserving the expectations of binary floating point users and helps performance.
- Provide an implementation that is as close as practical to the Java 1.5 BigDecimal math model which implements precision based floating point decimal math (ANSI X3.274-1996 and ANSI X3.274-1996/AM 1-2000 (section 7.4).
 
- 
- 
Constructor SummaryConstructors Constructor Description NumberMath()
 - 
Method SummaryAll Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description static java.lang.Numberabs(java.lang.Number number)protected abstract java.lang.NumberabsImpl(java.lang.Number number)static java.lang.Numberadd(java.lang.Number left, java.lang.Number right)abstract java.lang.NumberaddImpl(java.lang.Number left, java.lang.Number right)static java.lang.Numberand(java.lang.Number left, java.lang.Number right)protected java.lang.NumberandImpl(java.lang.Number left, java.lang.Number right)static java.lang.NumberbitwiseNegate(java.lang.Number left)protected java.lang.NumberbitwiseNegateImpl(java.lang.Number left)static intcompareTo(java.lang.Number left, java.lang.Number right)abstract intcompareToImpl(java.lang.Number left, java.lang.Number right)protected java.lang.UnsupportedOperationExceptioncreateUnsupportedException(java.lang.String operation, java.lang.Number left)static java.lang.Numberdivide(java.lang.Number left, java.lang.Number right)abstract java.lang.NumberdivideImpl(java.lang.Number left, java.lang.Number right)static NumberMathgetMath(java.lang.Number left, java.lang.Number right)Determine which NumberMath instance to use, given the supplied operands.static java.lang.Numberintdiv(java.lang.Number left, java.lang.Number right)protected java.lang.NumberintdivImpl(java.lang.Number left, java.lang.Number right)static booleanisBigDecimal(java.lang.Number number)static booleanisBigInteger(java.lang.Number number)static booleanisByte(java.lang.Number number)static booleanisFloatingPoint(java.lang.Number number)static booleanisInteger(java.lang.Number number)static booleanisLong(java.lang.Number number)static booleanisShort(java.lang.Number number)static java.lang.NumberleftShift(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently.protected java.lang.NumberleftShiftImpl(java.lang.Number left, java.lang.Number right)static java.lang.Numbermod(java.lang.Number left, java.lang.Number right)protected java.lang.NumbermodImpl(java.lang.Number left, java.lang.Number right)static java.lang.Numbermultiply(java.lang.Number left, java.lang.Number right)abstract java.lang.NumbermultiplyImpl(java.lang.Number left, java.lang.Number right)static java.lang.Numberor(java.lang.Number left, java.lang.Number right)protected java.lang.NumberorImpl(java.lang.Number left, java.lang.Number right)static java.lang.NumberrightShift(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently.protected java.lang.NumberrightShiftImpl(java.lang.Number left, java.lang.Number right)static java.lang.NumberrightShiftUnsigned(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently.protected java.lang.NumberrightShiftUnsignedImpl(java.lang.Number left, java.lang.Number right)static java.lang.Numbersubtract(java.lang.Number left, java.lang.Number right)abstract java.lang.NumbersubtractImpl(java.lang.Number left, java.lang.Number right)static java.math.BigDecimaltoBigDecimal(java.lang.Number n)static java.math.BigIntegertoBigInteger(java.lang.Number n)static java.lang.NumberunaryMinus(java.lang.Number left)protected abstract java.lang.NumberunaryMinusImpl(java.lang.Number left)static java.lang.NumberunaryPlus(java.lang.Number left)protected abstract java.lang.NumberunaryPlusImpl(java.lang.Number left)static java.lang.Numberxor(java.lang.Number left, java.lang.Number right)protected java.lang.NumberxorImpl(java.lang.Number left, java.lang.Number right)
 
- 
- 
- 
Method Detail- 
abspublic static java.lang.Number abs(java.lang.Number number) 
 - 
addpublic static java.lang.Number add(java.lang.Number left, java.lang.Number right)
 - 
subtractpublic static java.lang.Number subtract(java.lang.Number left, java.lang.Number right)
 - 
multiplypublic static java.lang.Number multiply(java.lang.Number left, java.lang.Number right)
 - 
dividepublic static java.lang.Number divide(java.lang.Number left, java.lang.Number right)
 - 
compareTopublic static int compareTo(java.lang.Number left, java.lang.Number right)
 - 
orpublic static java.lang.Number or(java.lang.Number left, java.lang.Number right)
 - 
andpublic static java.lang.Number and(java.lang.Number left, java.lang.Number right)
 - 
xorpublic static java.lang.Number xor(java.lang.Number left, java.lang.Number right)
 - 
intdivpublic static java.lang.Number intdiv(java.lang.Number left, java.lang.Number right)
 - 
modpublic static java.lang.Number mod(java.lang.Number left, java.lang.Number right)
 - 
leftShiftpublic static java.lang.Number leftShift(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.
 - 
rightShiftpublic static java.lang.Number rightShift(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.
 - 
rightShiftUnsignedpublic static java.lang.Number rightShiftUnsigned(java.lang.Number left, java.lang.Number right)For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.
 - 
bitwiseNegatepublic static java.lang.Number bitwiseNegate(java.lang.Number left) 
 - 
unaryMinuspublic static java.lang.Number unaryMinus(java.lang.Number left) 
 - 
unaryPluspublic static java.lang.Number unaryPlus(java.lang.Number left) 
 - 
isFloatingPointpublic static boolean isFloatingPoint(java.lang.Number number) 
 - 
isIntegerpublic static boolean isInteger(java.lang.Number number) 
 - 
isShortpublic static boolean isShort(java.lang.Number number) 
 - 
isBytepublic static boolean isByte(java.lang.Number number) 
 - 
isLongpublic static boolean isLong(java.lang.Number number) 
 - 
isBigDecimalpublic static boolean isBigDecimal(java.lang.Number number) 
 - 
isBigIntegerpublic static boolean isBigInteger(java.lang.Number number) 
 - 
toBigDecimalpublic static java.math.BigDecimal toBigDecimal(java.lang.Number n) 
 - 
toBigIntegerpublic static java.math.BigInteger toBigInteger(java.lang.Number n) 
 - 
getMathpublic static NumberMath getMath(java.lang.Number left, java.lang.Number right) Determine which NumberMath instance to use, given the supplied operands. This method implements the type promotion rules discussed in the documentation. Note that by the time this method is called, any Byte, Character or Short operands will have been promoted to Integer. For reference, here is the promotion matrix: bD bI D F L I bD bD bD D D bD bD bI bD bI D D bI bI D D D D D D D F D D D D D D L bD bI D D L L I bD bI D D L I Note that for division, if either operand isFloatingPoint, the result will be floating. Otherwise, the result is BigDecimal
 - 
absImplprotected abstract java.lang.Number absImpl(java.lang.Number number) 
 - 
addImplpublic abstract java.lang.Number addImpl(java.lang.Number left, java.lang.Number right)
 - 
subtractImplpublic abstract java.lang.Number subtractImpl(java.lang.Number left, java.lang.Number right)
 - 
multiplyImplpublic abstract java.lang.Number multiplyImpl(java.lang.Number left, java.lang.Number right)
 - 
divideImplpublic abstract java.lang.Number divideImpl(java.lang.Number left, java.lang.Number right)
 - 
compareToImplpublic abstract int compareToImpl(java.lang.Number left, java.lang.Number right)
 - 
unaryMinusImplprotected abstract java.lang.Number unaryMinusImpl(java.lang.Number left) 
 - 
unaryPlusImplprotected abstract java.lang.Number unaryPlusImpl(java.lang.Number left) 
 - 
bitwiseNegateImplprotected java.lang.Number bitwiseNegateImpl(java.lang.Number left) 
 - 
orImplprotected java.lang.Number orImpl(java.lang.Number left, java.lang.Number right)
 - 
andImplprotected java.lang.Number andImpl(java.lang.Number left, java.lang.Number right)
 - 
xorImplprotected java.lang.Number xorImpl(java.lang.Number left, java.lang.Number right)
 - 
modImplprotected java.lang.Number modImpl(java.lang.Number left, java.lang.Number right)
 - 
intdivImplprotected java.lang.Number intdivImpl(java.lang.Number left, java.lang.Number right)
 - 
leftShiftImplprotected java.lang.Number leftShiftImpl(java.lang.Number left, java.lang.Number right)
 - 
rightShiftImplprotected java.lang.Number rightShiftImpl(java.lang.Number left, java.lang.Number right)
 - 
rightShiftUnsignedImplprotected java.lang.Number rightShiftUnsignedImpl(java.lang.Number left, java.lang.Number right)
 - 
createUnsupportedExceptionprotected java.lang.UnsupportedOperationException createUnsupportedException(java.lang.String operation, java.lang.Number left)
 
- 
 
-