module CMath

Trigonometric and transcendental functions for complex numbers.

CMath is a library that provides trigonometric and transcendental functions for complex numbers. The functions in this module accept integers, floating-point numbers or complex numbers as arguments.

Note that the selection of functions is similar, but not identical, to that in module math. The reason for having two modules is that some users aren’t interested in complex numbers, and perhaps don’t even know what they are. They would rather have Math#sqrt raise an exception than return a complex number.

Usage

To start using this library, simply require cmath library:

require "cmath"

And after call any CMath function. For example:

CMath.sqrt(-9)          #=> 0+3.0i
CMath.exp(0 + 0i)       #=> 1.0+0.0i
CMath.log10(-5.to_c)    #=> (0.6989700043360187+1.3643763538418412i)

For more information you can see Complec class.

Public Class Methods

acos(z) click to toggle source

returns the arc cosine of z

CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
# File lib/cmath.rb, line 288
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

CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
# File lib/cmath.rb, line 353
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

CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
# File lib/cmath.rb, line 272
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

CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
# File lib/cmath.rb, line 337
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

CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
# File lib/cmath.rb, line 304
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

CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
# File lib/cmath.rb, line 321
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

CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
# File lib/cmath.rb, line 369
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

CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 164
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

CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
# File lib/cmath.rb, line 189
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

CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
# File lib/cmath.rb, line 239
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

CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
# File lib/cmath.rb, line 61
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.

CMath.log(1 + 4i)     #=> (1.416606672028108+1.3258176636680326i)
CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
# File lib/cmath.rb, line 81
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

CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# File lib/cmath.rb, line 121
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

CMath.log2(-1) => (0.0+4.532360141827194i)
# File lib/cmath.rb, line 105
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

CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
# File lib/cmath.rb, line 172
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

CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
# File lib/cmath.rb, line 222
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.

CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
# File lib/cmath.rb, line 137
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

CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
# File lib/cmath.rb, line 206
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

CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
# File lib/cmath.rb, line 256
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

CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
# File lib/cmath.rb, line 288
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

CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
# File lib/cmath.rb, line 353
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

CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
# File lib/cmath.rb, line 272
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

CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
# File lib/cmath.rb, line 337
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

CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
# File lib/cmath.rb, line 304
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

CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
# File lib/cmath.rb, line 321
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

CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
# File lib/cmath.rb, line 369
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

CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 164
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

CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
# File lib/cmath.rb, line 189
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

CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
# File lib/cmath.rb, line 239
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

CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
# File lib/cmath.rb, line 61
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.

CMath.log(1 + 4i)     #=> (1.416606672028108+1.3258176636680326i)
CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
# File lib/cmath.rb, line 81
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

CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# File lib/cmath.rb, line 121
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

CMath.log2(-1) => (0.0+4.532360141827194i)
# File lib/cmath.rb, line 105
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

CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
# File lib/cmath.rb, line 172
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

CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
# File lib/cmath.rb, line 222
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.

CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
# File lib/cmath.rb, line 137
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

CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
# File lib/cmath.rb, line 206
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

CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
# File lib/cmath.rb, line 256
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