# = 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.
# To start using this library, simply require cmath library:
# 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.
# Math::E raised to the +z+ power
# CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
Complex(ere * cos!(z.imag),
# 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)
unless b.nil? || b.kind_of?(Numeric)
raise TypeError, "Numeric Number required"
if z.real? and z >= 0 and (b.nil? or b >= 0)
a = Complex(log!(z.abs), z.arg)
# returns the base 2 logarithm of +z+
# CMath.log2(-1) => (0.0+4.532360141827194i)
# returns the base 10 logarithm of +z+
# CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# Returns the non-negative square root of Complex.
# CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
(z.imag == 0 && z.imag.to_s[0] == '-')
sqrt(z.conjugate).conjugate
Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
# returns the principal value of the cube root of +z+
# CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# returns the sine of +z+, where +z+ is given in radians
# CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
Complex(sin!(z.real) * cosh!(z.imag),
cos!(z.real) * sinh!(z.imag))
# returns the cosine of +z+, where +z+ is given in radians
# CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
Complex(cos!(z.real) * cosh!(z.imag),
-sin!(z.real) * sinh!(z.imag))
# returns the tangent of +z+, where +z+ is given in radians
# CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
# returns the hyperbolic sine of +z+, where +z+ is given in radians
# CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
Complex(sinh!(z.real) * cos!(z.imag),
cosh!(z.real) * sin!(z.imag))
# returns the hyperbolic cosine of +z+, where +z+ is given in radians
# CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
Complex(cosh!(z.real) * cos!(z.imag),
sinh!(z.real) * sin!(z.imag))
# returns the hyperbolic tangent of +z+, where +z+ is given in radians
# CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
# returns the arc sine of +z+
# CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
if z.real? and z >= -1 and z <= 1
(-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
# returns the arc cosine of +z+
# CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
if z.real? and z >= -1 and z <= 1
(-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
# returns the arc tangent of +z+
# CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
# 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)
(-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
# returns the inverse hyperbolic sine of +z+
# CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
log(z + sqrt(1.0 + z * z))
# returns the inverse hyperbolic cosine of +z+
# CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
log(z + sqrt(z * z - 1.0))
# returns the inverse hyperbolic tangent of +z+
# CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
if z.real? and z >= -1 and z <= 1
log((1.0 + z) / (1.0 - z)) / 2.0
def handle_no_method_error # :nodoc:
raise TypeError, "Numeric Number required"
module_function :handle_no_method_error