- java.lang.Object
-
- org.ojalgo.scalar.ExactDecimal<S>
-
- All Implemented Interfaces:
java.lang.Comparable<S>,Field<Scalar<S>>,Group,Group.Additive<Scalar<S>>,Group.Multiplicative<Scalar<S>>,NormedVectorSpace<Scalar<S>,S>,Operation,Operation.Addition<Scalar<S>>,Operation.Division<Scalar<S>>,Operation.Multiplication<Scalar<S>>,Operation.Subtraction<Scalar<S>>,Ring<Scalar<S>>,ScalarOperation,ScalarOperation.Addition<Scalar<S>,S>,ScalarOperation.Division<Scalar<S>,S>,ScalarOperation.Multiplication<Scalar<S>,S>,ScalarOperation.Subtraction<Scalar<S>,S>,VectorSpace<Scalar<S>,S>,Scalar<S>,SelfDeclaringScalar<S>,AccessScalar<S>,Tensor<S,Scalar<S>>,NumberContext.Enforceable<S>,NumberDefinition
public abstract class ExactDecimal<S extends ExactDecimal<S>> extends java.lang.Object implements SelfDeclaringScalar<S>
To help implement exact decimal numbers with a fixed number of decimal places (fixed scale).
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classExactDecimal.Descriptorstatic interfaceExactDecimal.Factory<S extends ExactDecimal<S>>-
Nested classes/interfaces inherited from interface org.ojalgo.algebra.Group
Group.Additive<T>, Group.Multiplicative<T>
-
Nested classes/interfaces inherited from interface org.ojalgo.algebra.Operation
Operation.Addition<T>, Operation.Division<T>, Operation.Multiplication<T>, Operation.Subtraction<T>
-
Nested classes/interfaces inherited from interface org.ojalgo.algebra.ScalarOperation
ScalarOperation.Addition<T,N extends java.lang.Comparable<N>>, ScalarOperation.Division<T,N extends java.lang.Comparable<N>>, ScalarOperation.Multiplication<T,N extends java.lang.Comparable<N>>, ScalarOperation.Subtraction<T,N extends java.lang.Comparable<N>>
-
-
Field Summary
Fields Modifier and Type Field Description private java.math.BigDecimalmyDecimalprivate longmyNumerator
-
Constructor Summary
Constructors Modifier Constructor Description protectedExactDecimal(long numerator)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description Sadd(double scalarAddend)Sadd(S scalarAddend)intcompareTo(S reference)Sconjugate()This method will (most likely) be moved to some other interface in the future! Just have to figure out where it fits...protected abstract ExactDecimal.Descriptordescriptor()Sdivide(double scalarDivisor)Sdivide(S scalarDivisor)doubledoubleValue()Senforce(NumberContext context)protected static longextractUnscaledValue(java.math.BigDecimal decimal, NumberContext cntxt)floatfloatValue()Sget()intintValue()Sinvert()The multiplicative inverse.booleanisAbsolute()booleanisSmall(double comparedTo)booleanisZero()Tests if this scalar value is exactly zero.longlongValue()Smultiply(double scalarMultiplicand)Smultiply(S scalarMultiplicand)Snegate()The additive inverse of this.doublenorm()this == this.signum().multiply(this.norm())(package private) longnumerator()Spower(int power)Multiply by itselfpowertimes.Ssignum()this == this.signum().multiply(this.norm())Ssubtract(double scalarSubtrahend)Ssubtract(S scalarSubtrahend)java.math.BigDecimaltoBigDecimal()private java.math.BigDecimaltoBigDecimal(NumberContext context)java.lang.StringtoString()java.lang.StringtoString(NumberContext context)protected abstract Swrap(long numerator)-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.ojalgo.type.NumberDefinition
booleanValue, byteValue, shortValue
-
Methods inherited from interface org.ojalgo.scalar.Scalar
add, dimensions, divide, multiply, rank, subtract, toPlainString
-
Methods inherited from interface org.ojalgo.scalar.SelfDeclaringScalar
add, divide, multiply, subtract
-
Methods inherited from interface org.ojalgo.tensor.Tensor
components, isSameShape
-
-
-
-
Method Detail
-
extractUnscaledValue
protected static long extractUnscaledValue(java.math.BigDecimal decimal, NumberContext cntxt)
-
add
public final S add(double scalarAddend)
- Specified by:
addin interfaceScalarOperation.Addition<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
addin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this + scalarAddend.
-
add
public final S add(S scalarAddend)
- Specified by:
addin interfaceScalarOperation.Addition<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
addin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this + scalarAddend.
-
compareTo
public final int compareTo(S reference)
- Specified by:
compareToin interfacejava.lang.Comparable<S extends ExactDecimal<S>>
-
conjugate
public final S conjugate()
Description copied from interface:VectorSpaceThis method will (most likely) be moved to some other interface in the future! Just have to figure out where it fits...
The conjugate transpose of a matrix and/or the conjugate of a scalar/field like ComplexNumber or Quaternion.
The conjugate transpose of a real matrix is simply its transpose.
- Specified by:
conjugatein interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Specified by:
conjugatein interfaceVectorSpace<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>
-
divide
public final S divide(double scalarDivisor)
- Specified by:
dividein interfaceScalarOperation.Division<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
dividein interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this / scalarDivisor.
-
divide
public final S divide(S scalarDivisor)
- Specified by:
dividein interfaceScalarOperation.Division<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
dividein interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this / scalarDivisor.
-
doubleValue
public final double doubleValue()
- Specified by:
doubleValuein interfaceNumberDefinition
-
enforce
public final S enforce(NumberContext context)
- Specified by:
enforcein interfaceNumberContext.Enforceable<S extends ExactDecimal<S>>
-
floatValue
public final float floatValue()
- Specified by:
floatValuein interfaceNumberDefinition
-
get
public final S get()
- Specified by:
getin interfaceAccessScalar<S extends ExactDecimal<S>>
-
intValue
public final int intValue()
- Specified by:
intValuein interfaceNumberDefinition
-
invert
public final S invert()
Description copied from interface:Group.MultiplicativeThe multiplicative inverse.- Specified by:
invertin interfaceGroup.Multiplicative<S extends ExactDecimal<S>>- Specified by:
invertin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
IDENTITY / this.
-
isAbsolute
public final boolean isAbsolute()
- Specified by:
isAbsolutein interfaceScalar<S extends ExactDecimal<S>>- Returns:
- true if this is equal to its own norm, modulus or absolute value (non-negative real part and no imaginary part); otherwise false.
- See Also:
Scalar.isAbsolute()
-
isSmall
public final boolean isSmall(double comparedTo)
- Specified by:
isSmallin interfaceNormedVectorSpace<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Parameters:
comparedTo- What to compare with- Returns:
- true if this is small compared to the magnitude of the input reference value.
-
isZero
public final boolean isZero()
Description copied from interface:ScalarTests if this scalar value is exactly zero.Each implementation should test for zero as exactly as possible based on what's achievable with that specific scalar type. The purpose is NOT to have similar behavior between different implementations, but rather to leverage the full precision and capabilities of each type.
For example:
- Primitive types (like
double) should use exact equality comparison - High-precision types (like
Quadruple) should check both base and remainder components - Arbitrary-precision types (like
BigDecimal) should use their built-in zero detection - Complex types should check both real and imaginary parts
This method should NOT use tolerance-based comparisons or approximate zero detection, as those are better handled by context-aware methods like
NormedVectorSpace.isSmall(double).- Specified by:
isZeroin interfaceScalar<S extends ExactDecimal<S>>- Returns:
- true if this scalar represents exactly zero, false otherwise
- See Also:
NormedVectorSpace.isSmall(double)
- Primitive types (like
-
longValue
public final long longValue()
- Specified by:
longValuein interfaceNumberDefinition
-
multiply
public final S multiply(double scalarMultiplicand)
- Specified by:
multiplyin interfaceScalarOperation.Multiplication<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
multiplyin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this * scalarMultiplicand.
-
multiply
public final S multiply(S scalarMultiplicand)
- Specified by:
multiplyin interfaceScalarOperation.Multiplication<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
multiplyin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this * multiplicand.
-
negate
public final S negate()
Description copied from interface:Group.AdditiveThe additive inverse of this.- Specified by:
negatein interfaceGroup.Additive<S extends ExactDecimal<S>>- Specified by:
negatein interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
-this.
-
norm
public final double norm()
Description copied from interface:NormedVectorSpacethis == this.signum().multiply(this.norm())- Specified by:
normin interfaceNormedVectorSpace<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Returns:
- The norm
-
power
public S power(int power)
Description copied from interface:Operation.MultiplicationMultiply by itselfpowertimes.- Specified by:
powerin interfaceOperation.Multiplication<S extends ExactDecimal<S>>- Specified by:
powerin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>
-
signum
public final S signum()
Description copied from interface:NormedVectorSpacethis == this.signum().multiply(this.norm())- Specified by:
signumin interfaceNormedVectorSpace<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
signumin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
- A unit "vector"
-
subtract
public final S subtract(double scalarSubtrahend)
- Specified by:
subtractin interfaceScalarOperation.Subtraction<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
subtractin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this - scalarSubtrahend.
-
subtract
public final S subtract(S scalarSubtrahend)
- Specified by:
subtractin interfaceScalarOperation.Subtraction<Scalar<S extends ExactDecimal<S>>,S extends ExactDecimal<S>>- Specified by:
subtractin interfaceSelfDeclaringScalar<S extends ExactDecimal<S>>- Returns:
this - scalarSubtrahend.
-
toBigDecimal
public final java.math.BigDecimal toBigDecimal()
- Specified by:
toBigDecimalin interfaceScalar<S extends ExactDecimal<S>>
-
toString
public final java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
toString
public final java.lang.String toString(NumberContext context)
- Specified by:
toStringin interfaceScalar<S extends ExactDecimal<S>>
-
toBigDecimal
private final java.math.BigDecimal toBigDecimal(NumberContext context)
-
descriptor
protected abstract ExactDecimal.Descriptor descriptor()
-
wrap
protected abstract S wrap(long numerator)
-
numerator
final long numerator()
-
-