[Java] Class NumberMath

  • org.codehaus.groovy.runtime.typehandling.NumberMath

Stateless 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:

  1. 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).
  2. 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.
  3. 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).

Methods Summary

Methods
Type Params Return Type Name and description
static Number abs(Number number)
protected Number absImpl(Number number)
static Number add(Number left, Number right)
Number addImpl(Number left, Number right)
static Number and(Number left, Number right)
protected Number andImpl(Number left, Number right)
static Number bitwiseNegate(Number left)
protected Number bitwiseNegateImpl(Number left)
static int compareTo(Number left, Number right)
int compareToImpl(Number left, Number right)
protected UnsupportedOperationException createUnsupportedException(String operation, Number left)
static Number divide(Number left, Number right)
Number divideImpl(Number left, Number right)
static NumberMath getMath(Number left, Number right)
Determine which NumberMath instance to use, given the supplied operands.
static Number intdiv(Number left, Number right)
protected Number intdivImpl(Number left, Number right)
static boolean isBigDecimal(Number number)
static boolean isBigInteger(Number number)
static boolean isByte(Number number)
static boolean isFloatingPoint(Number number)
static boolean isInteger(Number number)
static boolean isLong(Number number)
static boolean isShort(Number number)
static Number leftShift(Number left, Number right)
For this operation, consider the operands independently.
protected Number leftShiftImpl(Number left, Number right)
static Number mod(Number left, Number right)
protected Number modImpl(Number left, Number right)
static Number multiply(Number left, Number right)
Number multiplyImpl(Number left, Number right)
static Number or(Number left, Number right)
protected Number orImpl(Number left, Number right)
static Number rightShift(Number left, Number right)
For this operation, consider the operands independently.
protected Number rightShiftImpl(Number left, Number right)
static Number rightShiftUnsigned(Number left, Number right)
For this operation, consider the operands independently.
protected Number rightShiftUnsignedImpl(Number left, Number right)
static Number subtract(Number left, Number right)
Number subtractImpl(Number left, Number right)
static BigDecimal toBigDecimal(Number n)
static BigInteger toBigInteger(Number n)
static Number unaryMinus(Number left)
protected Number unaryMinusImpl(Number left)
static Number unaryPlus(Number left)
protected Number unaryPlusImpl(Number left)
static Number xor(Number left, Number right)
protected Number xorImpl(Number left, Number right)

Inherited Methods Summary

Inherited Methods
Methods inherited from class Name
class Object wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll

Method Detail

public static Number abs(Number number)

protected Number absImpl(Number number)

public static Number add(Number left, Number right)

public Number addImpl(Number left, Number right)

public static Number and(Number left, Number right)

protected Number andImpl(Number left, Number right)

public static Number bitwiseNegate(Number left)

protected Number bitwiseNegateImpl(Number left)

public static int compareTo(Number left, Number right)

public int compareToImpl(Number left, Number right)

protected UnsupportedOperationException createUnsupportedException(String operation, Number left)

public static Number divide(Number left, Number right)

public Number divideImpl(Number left, Number right)

public static NumberMath getMath(Number left, 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

public static Number intdiv(Number left, Number right)

protected Number intdivImpl(Number left, Number right)

public static boolean isBigDecimal(Number number)

public static boolean isBigInteger(Number number)

public static boolean isByte(Number number)

public static boolean isFloatingPoint(Number number)

public static boolean isInteger(Number number)

public static boolean isLong(Number number)

public static boolean isShort(Number number)

public static Number leftShift(Number left, 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.

protected Number leftShiftImpl(Number left, Number right)

public static Number mod(Number left, Number right)

protected Number modImpl(Number left, Number right)

public static Number multiply(Number left, Number right)

public Number multiplyImpl(Number left, Number right)

public static Number or(Number left, Number right)

protected Number orImpl(Number left, Number right)

public static Number rightShift(Number left, 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.

protected Number rightShiftImpl(Number left, Number right)

public static Number rightShiftUnsigned(Number left, 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.

protected Number rightShiftUnsignedImpl(Number left, Number right)

public static Number subtract(Number left, Number right)

public Number subtractImpl(Number left, Number right)

public static BigDecimal toBigDecimal(Number n)

public static BigInteger toBigInteger(Number n)

public static Number unaryMinus(Number left)

protected Number unaryMinusImpl(Number left)

public static Number unaryPlus(Number left)

protected Number unaryPlusImpl(Number left)

public static Number xor(Number left, Number right)

protected Number xorImpl(Number left, Number right)

© 2003-2020 The Apache Software Foundation
Licensed under the Apache license.
https://docs.groovy-lang.org/2.5.14/html/gapi/org/codehaus/groovy/runtime/typehandling/NumberMath.html