Class Complex

java.lang.Object
com.singularsys.jep.standard.Complex
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
Complex.NonPropagatingImmutableComplex

public class Complex extends Object implements Serializable
Represents a complex number with double precision real and imaginary components. Includes complex arithmetic functions.

The two main sources of reference used for creating this class were:
- "Numerical Recipes in C - The Art of Scientific Computing" (ISBN 0-521-43108-5) http://www.nr.com and
- The org.netlib.math.complex package (http://www.netlib.org) which was developed by Sandy Anderson and Priyantha Jayanetti (published under GPL).

Some arithmetic functions in this class are based on the mathematical equations given in the source of the netlib package. The functions were validated by comparing results with the netlib complex class.

It is important to note that the netlib complex package is more extensive and efficient (e.g. Garbage collector friendly) than this implementation. If high precision and efficiency if of necessity it is recommended to use the netlib package. see com.singularsys.jepexamples.applets.Fractal example application, not included in GWTJep

Version:
2.3.0 alpha now extends Number, has add() and sub() methods., 2.3.0 beta 1 now overrides equals and hashCode., 2.3.0 beta 2 does not implement Number anymore, as caused too many problems., 4.0.0 new power(int) methods, 4.0.0 ImmutableComplex and NonPropagatingImmutableComplex subclasses
Author:
Nathan Funk
See Also:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    An immutable version of the Complex class.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final Complex
    Constant 0+1 i
    static final Complex
    Constant 0-1 i
    static final Complex
    Constant -1+0 i
    static final Complex
    Constant 1+0 i
    static final Complex
    Constant 0+0 i
  • Constructor Summary

    Constructors
    Constructor
    Description
    Default constructor, gives zero.
    Complex(double x)
    Constructor from a single double value.
    Complex(double x, double y)
    Initialize the real and imaginary components to the values given by the parameters.
    Copy constructor
    Construct from a Number.
  • Method Summary

    Modifier and Type
    Method
    Description
    double
    abs()
    Returns the absolute value of the complex number.
    double
    Returns the square of the absolute value (re*re+im*im).
    Returns the arccos of this complex number.
    Returns the inverse hyperbolic cosine of this complex number.
    Adds the complex number with another complex value.
    double
    arg()
    Returns the argument of this complex number (Math.atan2(re,im))
    Returns the arcsin of this complex number.
    Returns the inverse hyperbolic sine of this complex number.
    Returns the arc tangent of this complex number.
    Returns the inverse hyperbolic tangent of this complex number.
    Returns the complex conjugate.
    cos()
    Returns the cosine of this complex number.
    Returns the hyperbolic cosine of this complex number.
    Returns the result of dividing this complex number by the parameter.
    double
    Returns real part.
    boolean
    An equals method compatible with double ==
    boolean
    equals(Complex w, double tolerance)
    Compares this object with the Complex number given as parameter
    boolean
    Compares this object against the specified object.
    fastPower(int n)
    Calculate integer powers by repeated multiplications.
    float
    Returns real part.
    int
    Always override hashCode when you override equals.
    double
    im()
    Returns the imaginary component of this object
    int
    Returns real part.
    boolean
    Returns true if either the real or imaginary component of this Complex is an infinite value.
    boolean
    Returns true if either the real or imaginary component of this Complex is a Not-a-Number (NaN) value.
    log()
    Returns the logarithm of this complex number.
    long
    Returns real part.
    mul(double b)
    Multiply the complex number with a double value.
    Multiply the complex number with another complex value.
    neg()
    Returns the negative value of this complex number.
    static Complex
    Converts an [r,theta] pair to a complex number r * e^(i theta).
    power(double exponent)
    Returns this complex number raised to a double argument.
    power(int n)
    Raise this complex to an integer power.
    power(Complex exponent)
    Returns the value of this complex number raised to the power of a complex exponent If this is zero return this.
    powerD(double exponent)
    Returns the value of this complex number raised to the power of a real component (in double precision).
    powerI(int n)
    Raise a complex number to an integer power.
    double
    re()
    Returns the real component of this object
    Returns the reciprocal of a complex number 1/z.
    void
    set(double x, double y)
    Sets the real and imaginary values of the object.
    void
    Copies the values from the parameter object to this object
    void
    setIm(double y)
    Sets the imaginary component of the object
    void
    setRe(double x)
    Sets the real component of the object
    sin()
    Returns the sine of this complex number.
    Returns the hyperbolic sine of this complex number.
    Calculates the square root of this object.
    Subtracts a complex number from this
    tan()
    Returns the tangent of this complex number.
    Returns the hyperbolic tangent of this complex number.
    Returns the value of this complex number as a string in the format:
    toString(boolean withI, boolean brackets)
    Format complex number with the x+y i notation with optional brackets.
    Print complex number in standard format with a number format applied to individual components.
    toString(NumberFormat format, boolean brackets)
    Prints using specified number format in format or "2" or "3 i" or "(2+3 i)" if brackets is true or "2+3 i" if brackets is false.

    Methods inherited from class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

    • ZERO

      public static final Complex ZERO
      Constant 0+0 i
    • ONE

      public static final Complex ONE
      Constant 1+0 i
    • MINUS_ONE

      public static final Complex MINUS_ONE
      Constant -1+0 i
    • I

      public static final Complex I
      Constant 0+1 i
    • MINUS_I

      public static final Complex MINUS_I
      Constant 0-1 i
  • Constructor Details

    • Complex

      public Complex()
      Default constructor, gives zero.
    • Complex

      public Complex(double x)
      Constructor from a single double value. The complex number is initialized with the real component equal to the parameter, and the imaginary component equal to zero.
      Parameters:
      x - real part
    • Complex

      public Complex(Number x)
      Construct from a Number. This constructor uses the doubleValue() method of the parameter to initialize the real component of the complex number. The imaginary component is initialized to zero.
      Parameters:
      x - number representing real value
    • Complex

      public Complex(Complex z)
      Copy constructor
      Parameters:
      z - complex number to copy from
    • Complex

      public Complex(double x, double y)
      Initialize the real and imaginary components to the values given by the parameters.
      Parameters:
      x - real component
      y - imaginary component
  • Method Details

    • re

      public double re()
      Returns the real component of this object
      Returns:
      the real part
    • im

      public double im()
      Returns the imaginary component of this object
      Returns:
      the imaginary part
    • set

      public void set(Complex z)
      Copies the values from the parameter object to this object
      Parameters:
      z - complex number to copy from
    • set

      public void set(double x, double y)
      Sets the real and imaginary values of the object.
      Parameters:
      x - real part
      y - imaginary part
    • setRe

      public void setRe(double x)
      Sets the real component of the object
      Parameters:
      x - real part
    • setIm

      public void setIm(double y)
      Sets the imaginary component of the object
      Parameters:
      y - imaginary part
    • equals

      public boolean equals(Complex w, double tolerance)
      Compares this object with the Complex number given as parameter
      b
      . The
      tolerance
      parameter is the radius within which the
      b
      number must lie for the two complex numbers to be considered equal.
      Parameters:
      w - complex number to compare with
      tolerance - distance to consider points as equals
      Returns:
      true
      if the complex number are considered equal,
      false
      otherwise.
    • eq

      public boolean eq(Complex z)
      An equals method compatible with double ==
      Parameters:
      z - complex number to test
      Returns:
      true if real parts are equals and complex parts are equals
      Since:
      3.5
    • equals

      public boolean equals(Object o)
      Compares this object against the specified object. The result is true if and only if the argument is not null and is a Complex object that represents the same complex number. Equality follows the same pattern as Double.equals() applies to each field:
      • If d1 and d2 both represent Double.NaN, then the equals method returns true, even though Double.NaN==Double.NaN has the value false.
      • If d1 represents +0.0 while d2 represents -0.0, or vice versa, the equal test has the value false, even though +0.0==-0.0 has the value true.
      This definition allows hash tables to operate properly.
      Overrides:
      equals in class Object
      Parameters:
      o - object to test against
      Returns:
      true is this equals o
      Since:
      2.3.0.2
    • hashCode

      public int hashCode()
      Always override hashCode when you override equals. Effective Java, Joshua Bloch, Sun Press
      Overrides:
      hashCode in class Object
      Returns:
      a hashcode
    • toString

      public String toString()
      Returns the value of this complex number as a string in the format:
      (real, imaginary)
      . Uses the standard.Complex.ToStringFormat message property
      Overrides:
      toString in class Object
      Returns:
      string representation
    • toString

      public String toString(boolean withI, boolean brackets)
      Format complex number with the x+y i notation with optional brackets. The following message properties are used
      • standard.Complex.ToStringNoBracketsRealWithI={0} used when imaginary part is zero and real part positive or zero
      • standard.Complex.ToStringNoBracketsNegRealWithI=-{0} used when imaginary part is zero and real part negative (abs(re) passed to format)
      • standard.Complex.ToStringNoBracketsImaginaryWithI={1} i used when imaginary part is zero
      • standard.Complex.ToStringNoBracketsImaginaryWithNegI=-{1} i when real part is zero and imaginary part is negative (abs(im) passed to format)
      • standard.Complex.ToStringNoBracketsWithI={0}+{1} i with positive imaginary component
      • standard.Complex.ToStringNoBracketsWithNegI={0}-{1} i with negative imaginary component
      • standard.Complex.ToStringBracketsRealWithI={0} used when real part is positive and the imaginary part is zero
      • standard.Complex.ToStringBracketsNegRealWithI=(-{0}) used when imaginary part is zero and real part negative (abs(re) passed to format)
      • standard.Complex.ToStringBracketsImaginaryWithI={1} i used when imaginary part is zero
      • standard.Complex.ToStringBracketsImaginaryWithNegI=(-{1} i) used when imaginary part is negative
      • standard.Complex.ToStringBracketsWithI=({0}+{1} i) with positive imaginary component
      • standard.Complex.ToStringBracketsWithNegI=({0}-{1} i) with negative imaginary component (abs(im) passed to format)
      Parameters:
      withI - whether to use the x+yi format, if false is the same as the standard toString method
      brackets - whether to enclose expressions in brackets if needed to prevent ambiguity, behaviour may change depending on message properties
      Returns:
      string rep
    • toString

      public String toString(NumberFormat format)
      Print complex number in standard format with a number format applied to individual components. This method relies on properties standard.Complex.ToStringWithNumberFormat=({0}, {1})
      Parameters:
      format - NumberFormat to apply to individual components
      Returns:
      string representation
    • toString

      public String toString(NumberFormat format, boolean brackets)
      Prints using specified number format in format or "2" or "3 i" or "(2+3 i)" if brackets is true or "2+3 i" if brackets is false. This method relies on properties
      • standard.Complex.ToStringNoBracketsRealWithI={0} used when imaginary part is zero and real part positive or zero
      • standard.Complex.ToStringNoBracketsNegRealWithI=-{0} used when imaginary part is zero and real part negative (abs(re) passed to format)
      • standard.Complex.ToStringNoBracketsImaginaryWithI={1} i used when imaginary part is zero
      • standard.Complex.ToStringNoBracketsImaginaryWithNegI=-{1} i when real part is zero and imaginary part is negative (abs(im) passed to format)
      • standard.Complex.ToStringNoBracketsWithI={0}+{1} i with positive imaginary component
      • standard.Complex.ToStringNoBracketsWithNegI={0}-{1} i with negative imaginary component
      • standard.Complex.ToStringBracketsRealWithI={0} used when real part is positive and the imaginary part is zero
      • standard.Complex.ToStringBracketsNegRealWithI=(-{0}) used when imaginary part is zero and real part negative (abs(re) passed to format)
      • standard.Complex.ToStringBracketsImaginaryWithI={1} i used when imaginary part is zero
      • standard.Complex.ToStringBracketsImaginaryWithNegI=(-{1} i) used when imaginary part is negative
      • standard.Complex.ToStringBracketsWithI=({0}+{1} i) with positive imaginary component
      • standard.Complex.ToStringBracketsWithNegI=({0}-{1} i) with negative imaginary component (abs(im) passed to format)
      Parameters:
      format - the NumberFormat to use, no sign or negative format should be used
      brackets - whether to enclose expressions in brackets if needed to prevent ambiguity, behaviour may change depending on message properties
      Returns:
      string rep
    • isInfinite

      public boolean isInfinite()
      Returns true if either the real or imaginary component of this Complex is an infinite value.
      Returns:
      true if either component of the Complex object is infinite; false, otherwise.
    • isNaN

      public boolean isNaN()
      Returns true if either the real or imaginary component of this Complex is a Not-a-Number (NaN) value.
      Returns:
      true if either component of the Complex object is NaN; false, otherwise.
    • abs

      public double abs()
      Returns the absolute value of the complex number.
      Returns:
      the absolute value
    • abs2

      public double abs2()
      Returns the square of the absolute value (re*re+im*im).
      Returns:
      square of absolute value
    • arg

      public double arg()
      Returns the argument of this complex number (Math.atan2(re,im))
      Returns:
      the argument
    • neg

      public Complex neg()
      Returns the negative value of this complex number.
      Returns:
      -(x+i y)
    • mul

      public Complex mul(double b)
      Multiply the complex number with a double value.
      Parameters:
      b - real number to multiply by
      Returns:
      The result of the multiplication
    • add

      public Complex add(Complex z)
      Adds the complex number with another complex value.
      Parameters:
      z - complex number to add
      Returns:
      The result of the addition
      Since:
      2.3.0.1
    • sub

      public Complex sub(Complex z)
      Subtracts a complex number from this
      Parameters:
      z - complex number to subtract
      Returns:
      (this) - z
      Since:
      2.3.0.1
    • mul

      public Complex mul(Complex z)
      Multiply the complex number with another complex value.
      Parameters:
      z - complex number to multiply
      Returns:
      The result of the multiplication
    • div

      public Complex div(Complex z)
      Returns the result of dividing this complex number by the parameter. Algorithm adapted from Numerical Recipes in C - The Art of Scientific Computing ISBN 0-521-43108-5
      Parameters:
      z - complex number to divide by
      Returns:
      (this)/z
    • reciprocal

      public Complex reciprocal()
      Returns the reciprocal of a complex number 1/z. This was broken in version < 4.0.
      Returns:
      1/(this)
    • power

      public Complex power(int n)
      Raise this complex to an integer power. For small power use the fastPower(int) method which does not do repeated multiplication and is generally faster. For larger power use powerI(int) which can be more accurate.
      Parameters:
      n - the power
      Returns:
      (this)^n
    • powerI

      public Complex powerI(int n)
      Raise a complex number to an integer power. Uses the polar form [r;th]^n -> [r^n;n th] and the efficient power method from Power.power(double, int) Slower than
      Parameters:
      n -
      Returns:
    • fastPower

      public Complex fastPower(int n)
      Calculate integer powers by repeated multiplications. So z^5 = z*(z*z)*(z*z). This routine is generally faster but can accumulate errors for large exponents.
      Parameters:
      n -
      Returns:
    • powerD

      public Complex powerD(double exponent)
      Returns the value of this complex number raised to the power of a real component (in double precision).

      This method considers special cases where a simpler algorithm would return "ugly" results.
      For example when the expression (-1e40)^0.5 is evaluated without considering the special case, the argument of the base is the double number closest to pi. When sin and cos are used for the final evaluation of the result, the slight difference of the argument from pi causes a non-zero value for the real component of the result. Because the value of the base is so high, the error is magnified. Although the error is normal for floating point calculations, the consideration of commonly occurring special cases improves the accuracy and aesthetics of the results.

      If you know a more elegant way to solve this problem, please let me know at [email protected] .

      Testing with roots of unity show errors are typically within 128 * ulp, so |actual-result|/|actual| < 1e-13.

      Parameters:
      exponent - exponent
      Returns:
      (this)^exponent
    • power

      public Complex power(double exponent)
      Returns this complex number raised to a double argument. If the exponent is an integer returns power(int) otherwise calls powerD(double).
      Parameters:
      exponent -
      Returns:
      this^exponent
    • power

      public Complex power(Complex exponent)
      Returns the value of this complex number raised to the power of a complex exponent If this is zero return this. If the exponent has zero imaginary part use
      Parameters:
      exponent - exponent
      Returns:
      (this)^exponent
    • conj

      public Complex conj()
      Returns the complex conjugate.
      Returns:
      (x-i y)
    • log

      public Complex log()
      Returns the logarithm of this complex number. The real part is Math.log(this.abs()) and the complex part is this.arg(), in the range -pi .. pi.
      Returns:
      ln(z) = ln(r) + i th
    • sqrt

      public Complex sqrt()
      Calculates the square root of this object. Adapted from Numerical Recipes in C - The Art of Scientific Computing (ISBN 0-521-43108-5)
      Returns:
      sqrt(z)
    • sin

      public Complex sin()
      Returns the sine of this complex number.
      Returns:
      sin(this)
    • cos

      public Complex cos()
      Returns the cosine of this complex number.
      Returns:
      cos(this)
    • tan

      public Complex tan()
      Returns the tangent of this complex number.
      Returns:
      tan(this)
    • asin

      public Complex asin()
      Returns the arcsin of this complex number.
      Returns:
      asin(this)
    • acos

      public Complex acos()
      Returns the arccos of this complex number.
      Returns:
      acos(this)
    • atan

      public Complex atan()
      Returns the arc tangent of this complex number.
      Returns:
      atan(this)
    • sinh

      public Complex sinh()
      Returns the hyperbolic sine of this complex number.
      Returns:
      sinh(this)
    • cosh

      public Complex cosh()
      Returns the hyperbolic cosine of this complex number.
      Returns:
      cosh(this)
    • tanh

      public Complex tanh()
      Returns the hyperbolic tangent of this complex number.
      Returns:
      tanh(this)
    • asinh

      public Complex asinh()
      Returns the inverse hyperbolic sine of this complex number.
      Returns:
      asinh(this)
    • acosh

      public Complex acosh()
      Returns the inverse hyperbolic cosine of this complex number.
      Returns:
      acosh(this)
    • atanh

      public Complex atanh()
      Returns the inverse hyperbolic tangent of this complex number.
      Returns:
      atanh(this)
    • polarValueOf

      public static Complex polarValueOf(Number r, Number theta)
      Converts an [r,theta] pair to a complex number r * e^(i theta).
      Parameters:
      r - The radius
      theta - The angle
      Returns:
      The complex result.
      Since:
      2.3.0.1
    • doubleValue

      public double doubleValue()
      Returns real part.
      Returns:
      real part
      Since:
      2.3.0.1
    • floatValue

      public float floatValue()
      Returns real part.
      Returns:
      real part converted to a float
      Since:
      2.3.0.1
    • intValue

      public int intValue()
      Returns real part.
      Returns:
      real part converted to an int
      Since:
      2.3.0.1
    • longValue

      public long longValue()
      Returns real part.
      Returns:
      real part converted to a long
      Since:
      2.3.0.1