org.codehaus.groovy.runtime
Class NumberMath

java.lang.Object
  extended byorg.codehaus.groovy.runtime.NumberMath
Direct Known Subclasses:
BigDecimalMath, BigIntegerMath, FloatingPointMath, IntegerMath, LongMath

public abstract class NumberMath
extends java.lang.Object

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 methods here represent only the operations supported by all Number subclasses. For example power() is not implemented here because it is not currently supported by BigDecimal (but will be in Java 1.5). 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).

Author:
Steve Goetze

Constructor Summary
NumberMath()
           
 
Method Summary
static java.lang.Number abs(java.lang.Number number)
           
protected abstract  java.lang.Number absImpl(java.lang.Number number)
           
static java.lang.Number add(java.lang.Number left, java.lang.Number right)
           
protected abstract  java.lang.Number addImpl(java.lang.Number left, java.lang.Number right)
           
static int compareTo(java.lang.Number left, java.lang.Number right)
           
protected abstract  int compareToImpl(java.lang.Number left, java.lang.Number right)
           
static java.lang.Number divide(java.lang.Number left, java.lang.Number right)
           
protected abstract  java.lang.Number divideImpl(java.lang.Number left, java.lang.Number right)
           
static boolean isBigDecimal(java.lang.Number number)
           
static boolean isBigInteger(java.lang.Number number)
           
static boolean isFloatingPoint(java.lang.Number number)
           
static boolean isInteger(java.lang.Number number)
           
static boolean isLong(java.lang.Number number)
           
static java.lang.Number multiply(java.lang.Number left, java.lang.Number right)
           
protected abstract  java.lang.Number multiplyImpl(java.lang.Number left, java.lang.Number right)
           
static java.lang.Number subtract(java.lang.Number left, java.lang.Number right)
           
protected abstract  java.lang.Number subtractImpl(java.lang.Number left, java.lang.Number right)
           
static java.math.BigDecimal toBigDecimal(java.lang.Number n)
           
static java.math.BigInteger toBigInteger(java.lang.Number n)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

NumberMath

public NumberMath()
Method Detail

abs

public static java.lang.Number abs(java.lang.Number number)

add

public static java.lang.Number add(java.lang.Number left,
                                   java.lang.Number right)

subtract

public static java.lang.Number subtract(java.lang.Number left,
                                        java.lang.Number right)

multiply

public static java.lang.Number multiply(java.lang.Number left,
                                        java.lang.Number right)

divide

public static java.lang.Number divide(java.lang.Number left,
                                      java.lang.Number right)

compareTo

public static int compareTo(java.lang.Number left,
                            java.lang.Number right)

isFloatingPoint

public static boolean isFloatingPoint(java.lang.Number number)

isInteger

public static boolean isInteger(java.lang.Number number)

isLong

public static boolean isLong(java.lang.Number number)

isBigDecimal

public static boolean isBigDecimal(java.lang.Number number)

isBigInteger

public static boolean isBigInteger(java.lang.Number number)

toBigDecimal

public static java.math.BigDecimal toBigDecimal(java.lang.Number n)

toBigInteger

public static java.math.BigInteger toBigInteger(java.lang.Number n)

absImpl

protected abstract java.lang.Number absImpl(java.lang.Number number)

addImpl

protected abstract java.lang.Number addImpl(java.lang.Number left,
                                            java.lang.Number right)

subtractImpl

protected abstract java.lang.Number subtractImpl(java.lang.Number left,
                                                 java.lang.Number right)

multiplyImpl

protected abstract java.lang.Number multiplyImpl(java.lang.Number left,
                                                 java.lang.Number right)

divideImpl

protected abstract java.lang.Number divideImpl(java.lang.Number left,
                                               java.lang.Number right)

compareToImpl

protected abstract int compareToImpl(java.lang.Number left,
                                     java.lang.Number right)


Copyright © 2003-2004 The Codehaus. All Rights Reserved.