- java.lang.Object
-
- org.ojalgo.scalar.Quadruple
-
- All Implemented Interfaces:
java.lang.Comparable<Quadruple>,Field<Scalar<Quadruple>>,Group,Group.Additive<Scalar<Quadruple>>,Group.Multiplicative<Scalar<Quadruple>>,NormedVectorSpace<Scalar<Quadruple>,Quadruple>,Operation,Operation.Addition<Scalar<Quadruple>>,Operation.Division<Scalar<Quadruple>>,Operation.Multiplication<Scalar<Quadruple>>,Operation.Subtraction<Scalar<Quadruple>>,Ring<Scalar<Quadruple>>,ScalarOperation,ScalarOperation.Addition<Scalar<Quadruple>,Quadruple>,ScalarOperation.Division<Scalar<Quadruple>,Quadruple>,ScalarOperation.Multiplication<Scalar<Quadruple>,Quadruple>,ScalarOperation.Subtraction<Scalar<Quadruple>,Quadruple>,VectorSpace<Scalar<Quadruple>,Quadruple>,Scalar<Quadruple>,SelfDeclaringScalar<Quadruple>,AccessScalar<Quadruple>,Tensor<Quadruple,Scalar<Quadruple>>,NumberContext.Enforceable<Quadruple>,NumberDefinition
public class Quadruple extends java.lang.Object implements SelfDeclaringScalar<Quadruple>
https://stackoverflow.com/questions/66962567/how-to-emulate-double-precision-using-two-floats-in-opengl-es
https://blog.cyclemap.link/2011-06-09-glsl-part2-emu/
https://www.researchgate.net/publication/228570156_Library_for_Double-Double_and_Quad-Double_Arithmetic
https://libntl.org
http://mrob.com/pub/math/f161.html
https://www.davidhbailey.com/dhbsoftware/
-
-
Nested Class Summary
-
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.scalar.Scalar
Scalar.Factory<N extends java.lang.Comparable<N>>
-
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 static Scalar.Factory<Quadruple>FACTORYstatic QuadrupleMAX_VALUEstatic QuadrupleMIN_VALUEprivate doublemyBaseprivate java.math.BigDecimalmyDecimalprivate doublemyRemainderstatic QuadrupleNaNstatic QuadrupleNEGstatic QuadrupleNEGATIVE_INFINITYstatic QuadrupleONEstatic QuadruplePOSITIVE_INFINITYprivate static doubleSPLIT1+2^27 (Example code, that emulated double using float, had 1+2^13)static QuadrupleTWOstatic QuadrupleZERO
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Quadrupleadd(double arg)private static Quadrupleadd(double base1, double remainder1, double base2, double remainder2)https://blog.cyclemap.link/2011-06-09-glsl-part2-emu/Quadrupleadd(Quadruple arg)intcompareTo(Quadruple reference)Quadrupleconjugate()This method will (most likely) be moved to some other interface in the future! Just have to figure out where it fits...Quadrupledivide(double arg)private static Quadrupledivide(double base1, double remainder1, double base2, double remainder2)High-precision division.Quadrupledivide(Quadruple arg)private static Quadrupledivide(Quadruple arg1, Quadruple arg2)doubledoubleValue()Quadrupleenforce(NumberContext context)booleanequals(java.lang.Object obj)floatfloatValue()Quadrupleget()(package private) doublegetBase()(package private) doublegetRemainder()inthashCode()intintValue()Quadrupleinvert()The multiplicative inverse.booleanisAbsolute()static booleanisAbsolute(Quadruple value)static booleanisInfinite(Quadruple value)static booleanisNaN(Quadruple value)booleanisSmall(double comparedTo)static booleanisSmall(double comparedTo, Quadruple value)booleanisZero()Tests if this scalar value is exactly zero.longlongValue()Quadruplemultiply(double arg)private static Quadruplemultiply(double base1, double remainder1, double base2, double remainder2)https://blog.cyclemap.link/2011-06-09-glsl-part2-emu/Quadruplemultiply(Quadruple arg)Quadruplenegate()The additive inverse of this.doublenorm()this == this.signum().multiply(this.norm())static Quadrupleparse(java.lang.CharSequence plainNumberString)Quadruplepower(int power)Multiply by itselfpowertimes.private intsign()Quadruplesignum()this == this.signum().multiply(this.norm())Quadruplesubtract(double arg)Quadruplesubtract(Quadruple arg)java.math.BigDecimaltoBigDecimal()private java.math.BigDecimaltoBigDecimal(java.math.MathContext context)java.lang.StringtoString()java.lang.StringtoString(NumberContext context)static QuadruplevalueOf(double value)static QuadruplevalueOf(java.lang.Comparable<?> number)static QuadruplevalueOf(java.math.BigDecimal number)-
Methods inherited from class java.lang.Object
clone, finalize, getClass, 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
-
-
-
-
Field Detail
-
FACTORY
public static Scalar.Factory<Quadruple> FACTORY
-
MAX_VALUE
public static final Quadruple MAX_VALUE
-
MIN_VALUE
public static final Quadruple MIN_VALUE
-
NaN
public static final Quadruple NaN
-
NEG
public static final Quadruple NEG
-
NEGATIVE_INFINITY
public static final Quadruple NEGATIVE_INFINITY
-
ONE
public static final Quadruple ONE
-
POSITIVE_INFINITY
public static final Quadruple POSITIVE_INFINITY
-
TWO
public static final Quadruple TWO
-
ZERO
public static final Quadruple ZERO
-
SPLIT
private static final double SPLIT
1+2^27 (Example code, that emulated double using float, had 1+2^13)- See Also:
- Constant Field Values
-
myBase
private final double myBase
-
myDecimal
private transient java.math.BigDecimal myDecimal
-
myRemainder
private final double myRemainder
-
-
Method Detail
-
isAbsolute
public static boolean isAbsolute(Quadruple value)
-
isInfinite
public static boolean isInfinite(Quadruple value)
-
isNaN
public static boolean isNaN(Quadruple value)
-
isSmall
public static boolean isSmall(double comparedTo, Quadruple value)
-
parse
public static Quadruple parse(java.lang.CharSequence plainNumberString)
-
valueOf
public static Quadruple valueOf(java.math.BigDecimal number)
-
valueOf
public static Quadruple valueOf(java.lang.Comparable<?> number)
-
valueOf
public static Quadruple valueOf(double value)
-
add
private static Quadruple add(double base1, double remainder1, double base2, double remainder2)
https://blog.cyclemap.link/2011-06-09-glsl-part2-emu/
-
divide
private static Quadruple divide(double base1, double remainder1, double base2, double remainder2)
High-precision division.
-
multiply
private static Quadruple multiply(double base1, double remainder1, double base2, double remainder2)
https://blog.cyclemap.link/2011-06-09-glsl-part2-emu/
-
add
public Quadruple add(double arg)
- Specified by:
addin interfaceScalarOperation.Addition<Scalar<Quadruple>,Quadruple>- Specified by:
addin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this + scalarAddend.
-
add
public Quadruple add(Quadruple arg)
- Specified by:
addin interfaceScalarOperation.Addition<Scalar<Quadruple>,Quadruple>- Specified by:
addin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this + scalarAddend.
-
compareTo
public int compareTo(Quadruple reference)
- Specified by:
compareToin interfacejava.lang.Comparable<Quadruple>
-
conjugate
public Quadruple 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<Quadruple>- Specified by:
conjugatein interfaceVectorSpace<Scalar<Quadruple>,Quadruple>
-
divide
public Quadruple divide(double arg)
- Specified by:
dividein interfaceScalarOperation.Division<Scalar<Quadruple>,Quadruple>- Specified by:
dividein interfaceSelfDeclaringScalar<Quadruple>- Returns:
this / scalarDivisor.
-
divide
public Quadruple divide(Quadruple arg)
- Specified by:
dividein interfaceScalarOperation.Division<Scalar<Quadruple>,Quadruple>- Specified by:
dividein interfaceSelfDeclaringScalar<Quadruple>- Returns:
this / scalarDivisor.
-
doubleValue
public double doubleValue()
- Specified by:
doubleValuein interfaceNumberDefinition
-
enforce
public Quadruple enforce(NumberContext context)
- Specified by:
enforcein interfaceNumberContext.Enforceable<Quadruple>
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equalsin classjava.lang.Object
-
floatValue
public float floatValue()
- Specified by:
floatValuein interfaceNumberDefinition
-
get
public Quadruple get()
- Specified by:
getin interfaceAccessScalar<Quadruple>
-
hashCode
public int hashCode()
- Overrides:
hashCodein classjava.lang.Object
-
intValue
public int intValue()
- Specified by:
intValuein interfaceNumberDefinition
-
invert
public Quadruple invert()
Description copied from interface:Group.MultiplicativeThe multiplicative inverse.- Specified by:
invertin interfaceGroup.Multiplicative<Scalar<Quadruple>>- Specified by:
invertin interfaceSelfDeclaringScalar<Quadruple>- Returns:
IDENTITY / this.
-
isAbsolute
public boolean isAbsolute()
- Specified by:
isAbsolutein interfaceScalar<Quadruple>- 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 boolean isSmall(double comparedTo)
- Specified by:
isSmallin interfaceNormedVectorSpace<Scalar<Quadruple>,Quadruple>- Parameters:
comparedTo- What to compare with- Returns:
- true if this is small compared to the magnitude of the input reference value.
-
isZero
public 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<Quadruple>- Returns:
- true if this scalar represents exactly zero, false otherwise
- See Also:
NormedVectorSpace.isSmall(double)
- Primitive types (like
-
longValue
public long longValue()
- Specified by:
longValuein interfaceNumberDefinition
-
multiply
public Quadruple multiply(double arg)
- Specified by:
multiplyin interfaceScalarOperation.Multiplication<Scalar<Quadruple>,Quadruple>- Specified by:
multiplyin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this * scalarMultiplicand.
-
multiply
public Quadruple multiply(Quadruple arg)
- Specified by:
multiplyin interfaceScalarOperation.Multiplication<Scalar<Quadruple>,Quadruple>- Specified by:
multiplyin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this * multiplicand.
-
negate
public Quadruple negate()
Description copied from interface:Group.AdditiveThe additive inverse of this.- Specified by:
negatein interfaceGroup.Additive<Scalar<Quadruple>>- Specified by:
negatein interfaceSelfDeclaringScalar<Quadruple>- Returns:
-this.
-
norm
public double norm()
Description copied from interface:NormedVectorSpacethis == this.signum().multiply(this.norm())- Specified by:
normin interfaceNormedVectorSpace<Scalar<Quadruple>,Quadruple>- Returns:
- The norm
-
power
public Quadruple power(int power)
Description copied from interface:Operation.MultiplicationMultiply by itselfpowertimes.- Specified by:
powerin interfaceOperation.Multiplication<Scalar<Quadruple>>- Specified by:
powerin interfaceSelfDeclaringScalar<Quadruple>
-
signum
public Quadruple signum()
Description copied from interface:NormedVectorSpacethis == this.signum().multiply(this.norm())- Specified by:
signumin interfaceNormedVectorSpace<Scalar<Quadruple>,Quadruple>- Specified by:
signumin interfaceSelfDeclaringScalar<Quadruple>- Returns:
- A unit "vector"
-
subtract
public Quadruple subtract(double arg)
- Specified by:
subtractin interfaceScalarOperation.Subtraction<Scalar<Quadruple>,Quadruple>- Specified by:
subtractin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this - scalarSubtrahend.
-
subtract
public Quadruple subtract(Quadruple arg)
- Specified by:
subtractin interfaceScalarOperation.Subtraction<Scalar<Quadruple>,Quadruple>- Specified by:
subtractin interfaceSelfDeclaringScalar<Quadruple>- Returns:
this - scalarSubtrahend.
-
toBigDecimal
public java.math.BigDecimal toBigDecimal()
- Specified by:
toBigDecimalin interfaceScalar<Quadruple>
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
toString
public java.lang.String toString(NumberContext context)
-
sign
private int sign()
-
toBigDecimal
private java.math.BigDecimal toBigDecimal(java.math.MathContext context)
-
getBase
double getBase()
-
getRemainder
double getRemainder()
-
-