module CMath

CMath

CMath is a library that provides trigonometric and transcendental functions for complex numbers.

Usage

To start using this library, simply:

require "cmath"

Square root of a negative number is a complex number.

CMath.sqrt(-9)  #=> 0+3.0i

Public Class Methods

acos(z) click to toggle source

returns the arc cosine of z

# File lib/cmath.rb, line 257
def acos(z)
  begin
    if z.real? and z >= -1 and z <= 1
      acos!(z)
    else
      (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: acos!
acos!(z)
Alias for: acos
acosh(z) click to toggle source

returns the inverse hyperbolic cosine of z

# File lib/cmath.rb, line 314
def acosh(z)
  begin
    if z.real? and z >= 1
      acosh!(z)
    else
      log(z + sqrt(z * z - 1.0))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: acosh!
acosh!(z)
Alias for: acosh
asin(z) click to toggle source

returns the arc sine of z

# File lib/cmath.rb, line 243
def asin(z)
  begin
    if z.real? and z >= -1 and z <= 1
      asin!(z)
    else
      (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: asin!
asin!(z)
Alias for: asin
asinh(z) click to toggle source

returns the inverse hyperbolic sine of z

# File lib/cmath.rb, line 300
def asinh(z)
  begin
    if z.real?
      asinh!(z)
    else
      log(z + sqrt(1.0 + z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: asinh!
asinh!(z)
Alias for: asinh
atan(z) click to toggle source

returns the arc tangent of z

# File lib/cmath.rb, line 271
def atan(z)
  begin
    if z.real?
      atan!(z)
    else
      1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atan!
atan!(z)
Alias for: atan
atan2(y,x) click to toggle source

returns the arc tangent of y divided by x using the signs of y and x to determine the quadrant

# File lib/cmath.rb, line 286
def atan2(y,x)
  begin
    if y.real? and x.real?
      atan2!(y,x)
    else
      (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atan2!
atan2!(y,x)
Alias for: atan2
atanh(z) click to toggle source

returns the inverse hyperbolic tangent of z

# File lib/cmath.rb, line 328
def atanh(z)
  begin
    if z.real? and z >= -1 and z <= 1
      atanh!(z)
    else
      log((1.0 + z) / (1.0 - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atanh!
atanh!(z)
Alias for: atanh
cbrt(z) click to toggle source

returns the principal value of the cube root of z

# File lib/cmath.rb, line 149
def cbrt(z)
  z ** (1.0/3)
end
Also aliased as: cbrt!
cbrt!(z)
Alias for: cbrt
cos(z) click to toggle source

returns the cosine of z, where z is given in radians

# File lib/cmath.rb, line 170
def cos(z)
  begin
    if z.real?
      cos!(z)
    else
      Complex(cos!(z.real) * cosh!(z.imag),
              -sin!(z.real) * sinh!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: cos!
cos!(z)
Alias for: cos
cosh(z) click to toggle source

returns the hyperbolic cosine of z, where z is given in radians

# File lib/cmath.rb, line 214
def cosh(z)
  begin
    if z.real?
      cosh!(z)
    else
      Complex(cosh!(z.real) * cos!(z.imag),
              sinh!(z.real) * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: cosh!
cosh!(z)
Alias for: cosh
exp(z) click to toggle source

Math::E raised to the z power

exp(Complex(0,0))      #=> 1.0+0.0i
exp(Complex(0,PI))     #=> -1.0+1.2246467991473532e-16i
exp(Complex(0,PI/2.0)) #=> 6.123233995736766e-17+1.0i
# File lib/cmath.rb, line 52
def exp(z)
  begin
    if z.real?
      exp!(z)
    else
      ere = exp!(z.real)
      Complex(ere * cos!(z.imag),
              ere * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: exp!
exp!(z)
Alias for: exp
log(*args) click to toggle source

Returns the natural logarithm of Complex. If a second argument is given, it will be the base of logarithm.

log(Complex(0,0)) #=> -Infinity+0.0i
# File lib/cmath.rb, line 71
def log(*args)
  begin
    z, b = args
    unless b.nil? || b.kind_of?(Numeric)
      raise TypeError,  "Numeric Number required"
    end
    if z.real? and z >= 0 and (b.nil? or b >= 0)
      log!(*args)
    else
      a = Complex(log!(z.abs), z.arg)
      if b
        a /= log(b)
      end
      a
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log!
log!(*args)
Alias for: log
log10(z) click to toggle source

returns the base 10 logarithm of z

# File lib/cmath.rb, line 107
def log10(z)
  begin
    if z.real? and z >= 0
      log10!(z)
    else
      log(z) / log!(10)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log10!
log10!(z)
Alias for: log10
log2(z) click to toggle source

returns the base 2 logarithm of z

# File lib/cmath.rb, line 93
def log2(z)
  begin
    if z.real? and z >= 0
      log2!(z)
    else
      log(z) / log!(2)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log2!
log2!(z)
Alias for: log2
sin(z) click to toggle source

returns the sine of z, where z is given in radians

# File lib/cmath.rb, line 155
def sin(z)
  begin
    if z.real?
      sin!(z)
    else
      Complex(sin!(z.real) * cosh!(z.imag),
              cos!(z.real) * sinh!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sin!
sin!(z)
Alias for: sin
sinh(z) click to toggle source

returns the hyperbolic sine of z, where z is given in radians

# File lib/cmath.rb, line 199
def sinh(z)
  begin
    if z.real?
      sinh!(z)
    else
      Complex(sinh!(z.real) * cos!(z.imag),
              cosh!(z.real) * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sinh!
sinh!(z)
Alias for: sinh
sqrt(z) click to toggle source

Returns the non-negative square root of Complex.

sqrt(-1)            #=> 0+1.0i
sqrt(Complex(-1,0)) #=> 0.0+1.0i
sqrt(Complex(0,8))  #=> 2.0+2.0i
# File lib/cmath.rb, line 124
def sqrt(z)
  begin
    if z.real?
      if z < 0
        Complex(0, sqrt!(-z))
      else
        sqrt!(z)
      end
    else
      if z.imag < 0 ||
          (z.imag == 0 && z.imag.to_s[0] == '-')
        sqrt(z.conjugate).conjugate
      else
        r = z.abs
        x = z.real
        Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
      end
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sqrt!
sqrt!(z)
Alias for: sqrt
tan(z) click to toggle source

returns the tangent of z, where z is given in radians

# File lib/cmath.rb, line 185
def tan(z)
  begin
    if z.real?
      tan!(z)
    else
      sin(z) / cos(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: tan!
tan!(z)
Alias for: tan
tanh(z) click to toggle source

returns the hyperbolic tangent of z, where z is given in radians

# File lib/cmath.rb, line 229
def tanh(z)
  begin
    if z.real?
      tanh!(z)
    else
      sinh(z) / cosh(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: tanh!
tanh!(z)
Alias for: tanh

Private Instance Methods

acos(z) click to toggle source

returns the arc cosine of z

# File lib/cmath.rb, line 257
def acos(z)
  begin
    if z.real? and z >= -1 and z <= 1
      acos!(z)
    else
      (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: acos!
acos!(z)
Alias for: acos
acosh(z) click to toggle source

returns the inverse hyperbolic cosine of z

# File lib/cmath.rb, line 314
def acosh(z)
  begin
    if z.real? and z >= 1
      acosh!(z)
    else
      log(z + sqrt(z * z - 1.0))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: acosh!
acosh!(z)
Alias for: acosh
asin(z) click to toggle source

returns the arc sine of z

# File lib/cmath.rb, line 243
def asin(z)
  begin
    if z.real? and z >= -1 and z <= 1
      asin!(z)
    else
      (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: asin!
asin!(z)
Alias for: asin
asinh(z) click to toggle source

returns the inverse hyperbolic sine of z

# File lib/cmath.rb, line 300
def asinh(z)
  begin
    if z.real?
      asinh!(z)
    else
      log(z + sqrt(1.0 + z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: asinh!
asinh!(z)
Alias for: asinh
atan(z) click to toggle source

returns the arc tangent of z

# File lib/cmath.rb, line 271
def atan(z)
  begin
    if z.real?
      atan!(z)
    else
      1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atan!
atan!(z)
Alias for: atan
atan2(y,x) click to toggle source

returns the arc tangent of y divided by x using the signs of y and x to determine the quadrant

# File lib/cmath.rb, line 286
def atan2(y,x)
  begin
    if y.real? and x.real?
      atan2!(y,x)
    else
      (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atan2!
atan2!(y,x)
Alias for: atan2
atanh(z) click to toggle source

returns the inverse hyperbolic tangent of z

# File lib/cmath.rb, line 328
def atanh(z)
  begin
    if z.real? and z >= -1 and z <= 1
      atanh!(z)
    else
      log((1.0 + z) / (1.0 - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: atanh!
atanh!(z)
Alias for: atanh
cbrt(z) click to toggle source

returns the principal value of the cube root of z

# File lib/cmath.rb, line 149
def cbrt(z)
  z ** (1.0/3)
end
Also aliased as: cbrt!
cbrt!(z)
Alias for: cbrt
cos(z) click to toggle source

returns the cosine of z, where z is given in radians

# File lib/cmath.rb, line 170
def cos(z)
  begin
    if z.real?
      cos!(z)
    else
      Complex(cos!(z.real) * cosh!(z.imag),
              -sin!(z.real) * sinh!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: cos!
cos!(z)
Alias for: cos
cosh(z) click to toggle source

returns the hyperbolic cosine of z, where z is given in radians

# File lib/cmath.rb, line 214
def cosh(z)
  begin
    if z.real?
      cosh!(z)
    else
      Complex(cosh!(z.real) * cos!(z.imag),
              sinh!(z.real) * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: cosh!
cosh!(z)
Alias for: cosh
exp(z) click to toggle source

Math::E raised to the z power

exp(Complex(0,0))      #=> 1.0+0.0i
exp(Complex(0,PI))     #=> -1.0+1.2246467991473532e-16i
exp(Complex(0,PI/2.0)) #=> 6.123233995736766e-17+1.0i
# File lib/cmath.rb, line 52
def exp(z)
  begin
    if z.real?
      exp!(z)
    else
      ere = exp!(z.real)
      Complex(ere * cos!(z.imag),
              ere * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: exp!
exp!(z)
Alias for: exp
log(*args) click to toggle source

Returns the natural logarithm of Complex. If a second argument is given, it will be the base of logarithm.

log(Complex(0,0)) #=> -Infinity+0.0i
# File lib/cmath.rb, line 71
def log(*args)
  begin
    z, b = args
    unless b.nil? || b.kind_of?(Numeric)
      raise TypeError,  "Numeric Number required"
    end
    if z.real? and z >= 0 and (b.nil? or b >= 0)
      log!(*args)
    else
      a = Complex(log!(z.abs), z.arg)
      if b
        a /= log(b)
      end
      a
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log!
log!(*args)
Alias for: log
log10(z) click to toggle source

returns the base 10 logarithm of z

# File lib/cmath.rb, line 107
def log10(z)
  begin
    if z.real? and z >= 0
      log10!(z)
    else
      log(z) / log!(10)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log10!
log10!(z)
Alias for: log10
log2(z) click to toggle source

returns the base 2 logarithm of z

# File lib/cmath.rb, line 93
def log2(z)
  begin
    if z.real? and z >= 0
      log2!(z)
    else
      log(z) / log!(2)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: log2!
log2!(z)
Alias for: log2
sin(z) click to toggle source

returns the sine of z, where z is given in radians

# File lib/cmath.rb, line 155
def sin(z)
  begin
    if z.real?
      sin!(z)
    else
      Complex(sin!(z.real) * cosh!(z.imag),
              cos!(z.real) * sinh!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sin!
sin!(z)
Alias for: sin
sinh(z) click to toggle source

returns the hyperbolic sine of z, where z is given in radians

# File lib/cmath.rb, line 199
def sinh(z)
  begin
    if z.real?
      sinh!(z)
    else
      Complex(sinh!(z.real) * cos!(z.imag),
              cosh!(z.real) * sin!(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sinh!
sinh!(z)
Alias for: sinh
sqrt(z) click to toggle source

Returns the non-negative square root of Complex.

sqrt(-1)            #=> 0+1.0i
sqrt(Complex(-1,0)) #=> 0.0+1.0i
sqrt(Complex(0,8))  #=> 2.0+2.0i
# File lib/cmath.rb, line 124
def sqrt(z)
  begin
    if z.real?
      if z < 0
        Complex(0, sqrt!(-z))
      else
        sqrt!(z)
      end
    else
      if z.imag < 0 ||
          (z.imag == 0 && z.imag.to_s[0] == '-')
        sqrt(z.conjugate).conjugate
      else
        r = z.abs
        x = z.real
        Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
      end
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: sqrt!
sqrt!(z)
Alias for: sqrt
tan(z) click to toggle source

returns the tangent of z, where z is given in radians

# File lib/cmath.rb, line 185
def tan(z)
  begin
    if z.real?
      tan!(z)
    else
      sin(z) / cos(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: tan!
tan!(z)
Alias for: tan
tanh(z) click to toggle source

returns the hyperbolic tangent of z, where z is given in radians

# File lib/cmath.rb, line 229
def tanh(z)
  begin
    if z.real?
      tanh!(z)
    else
      sinh(z) / cosh(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end
Also aliased as: tanh!
tanh!(z)
Alias for: tanh