123456789_123456789_123456789_123456789_123456789_

Module: CMath

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, Math
Defined in: lib/cmath.rb

Overview

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(-1) 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.

Class Method Summary

  • .acos(z) mod_func

    returns the arc cosine of z

  • .acos! mod_func
  • .acosh(z) mod_func

    returns the inverse hyperbolic cosine of z

  • .acosh! mod_func
  • .asin(z) mod_func

    returns the arc sine of z

  • .asin! mod_func
  • .asinh(z) mod_func

    returns the inverse hyperbolic sine of z

  • .asinh! mod_func
  • .atan(z) mod_func

    returns the arc tangent of z

  • .atan! mod_func
  • .atan2(y, x) mod_func

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

  • .atan2! mod_func
  • .atanh(z) mod_func

    returns the inverse hyperbolic tangent of z

  • .atanh! mod_func
  • .cbrt(z) mod_func

    returns the principal value of the cube root of z

  • .cbrt! mod_func
  • .cos(z) mod_func

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

  • .cos! mod_func
  • .cosh(z) mod_func

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

  • .cosh! mod_func
  • .exp(z) mod_func

    Math::E raised to the z power.

  • .exp! mod_func
  • .log(*args) mod_func

    Returns the natural logarithm of Complex.

  • .log! mod_func
  • .log10(z) mod_func

    returns the base 10 logarithm of z

  • .log10! mod_func
  • .log2(z) mod_func

    returns the base 2 logarithm of z

  • .log2! mod_func
  • .sin(z) mod_func

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

  • .sin! mod_func
  • .sinh(z) mod_func

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

  • .sinh! mod_func
  • .sqrt(z) mod_func

    Returns the non-negative square root of Complex.

  • .sqrt! mod_func
  • .tan(z) mod_func

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

  • .tan! mod_func
  • .tanh(z) mod_func

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

  • .tanh! mod_func

Class Method Details

.acos(z) (mod_func)

returns the arc cosine of z

CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
[ GitHub ]

  
# 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

.acos! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 49

alias acos! acos

.acosh(z) (mod_func)

returns the inverse hyperbolic cosine of z

CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
[ GitHub ]

  
# 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

.acosh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 54

alias acosh! acosh

.asin(z) (mod_func)

returns the arc sine of z

CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
[ GitHub ]

  
# 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

.asin! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 48

alias asin! asin

.asinh(z) (mod_func)

returns the inverse hyperbolic sine of z

CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
[ GitHub ]

  
# 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

.asinh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 53

alias asinh! asinh

.atan(z) (mod_func)

returns the arc tangent of z

CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
[ GitHub ]

  
# 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

.atan! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 50

alias atan! atan

.atan2(y, x) (mod_func)

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)
[ GitHub ]

  
# 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

.atan2! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 51

alias atan2! atan2

.atanh(z) (mod_func)

returns the inverse hyperbolic tangent of z

CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
[ GitHub ]

  
# 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

.atanh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 55

alias atanh! atanh

.cbrt(z) (mod_func)

returns the principal value of the cube root of z

CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
[ GitHub ]

  
# File 'lib/cmath.rb', line 164

def cbrt(z)
  z ** (1.0/3)
end

.cbrt! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 38

alias cbrt! cbrt

.cos(z) (mod_func)

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

CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
[ GitHub ]

  
# 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

.cos! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 41

alias cos! cos

.cosh(z) (mod_func)

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

CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
[ GitHub ]

  
# 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

.cosh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 45

alias cosh! cosh

.exp(z) (mod_func)

Math::E raised to the z power

CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
[ GitHub ]

  
# 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

.exp! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 33

alias exp! exp

.log(*args) (mod_func)

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)
[ GitHub ]

  
# 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

.log! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 34

alias log! log

.log10(z) (mod_func)

returns the base 10 logarithm of z

CMath.log10(-1) #=> (0.0+1.3643763538418412i)
[ GitHub ]

  
# 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

.log10! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 36

alias log10! log10

.log2(z) (mod_func)

returns the base 2 logarithm of z

CMath.log2(-1) => (0.0+4.532360141827194i)
[ GitHub ]

  
# 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

.log2! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 35

alias log2! log2

.sin(z) (mod_func)

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

CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
[ GitHub ]

  
# 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

.sin! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 40

alias sin! sin

.sinh(z) (mod_func)

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

CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
[ GitHub ]

  
# 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

.sinh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 44

alias sinh! sinh

.sqrt(z) (mod_func)

Returns the non-negative square root of Complex.

CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
[ GitHub ]

  
# 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

.sqrt! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 37

alias sqrt! sqrt

.tan(z) (mod_func)

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

CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
[ GitHub ]

  
# 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

.tan! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 42

alias tan! tan

.tanh(z) (mod_func)

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

CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
[ GitHub ]

  
# 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

.tanh! (mod_func)

[ GitHub ]

  
# File 'lib/cmath.rb', line 46

alias tanh! tanh