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
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
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
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
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
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
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
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
returns the principal value of the cube root of z
# File lib/cmath.rb, line 149 def cbrt(z) z ** (1.0/3) end
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
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
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
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
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
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
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
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
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
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
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
Private Instance Methods
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
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
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
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
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
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
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
returns the principal value of the cube root of z
# File lib/cmath.rb, line 149 def cbrt(z) z ** (1.0/3) end
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
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
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
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
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
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
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
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
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
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
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