Module: CMath
- Includes:
- Math
- Defined in:
- lib/cmath.rb
Overview
frozen_string_literal: false
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.
For more information you can see Complex class.
Usage
To start using this library, simply require cmath library:
require "cmath"
Class Method Summary collapse
-
.acos(z) ⇒ Object
Returns the arc cosine of
z
. - .acos! ⇒ Object
-
.acosh(z) ⇒ Object
returns the inverse hyperbolic cosine of
z
. - .acosh! ⇒ Object
-
.asin(z) ⇒ Object
Returns the arc sine of
z
. - .asin! ⇒ Object
-
.asinh(z) ⇒ Object
returns the inverse hyperbolic sine of
z
. - .asinh! ⇒ Object
-
.atan(z) ⇒ Object
Returns the arc tangent of
z
. - .atan! ⇒ Object
-
.atan2(y, x) ⇒ Object
returns the arc tangent of
y
divided byx
using the signs ofy
andx
to determine the quadrant. - .atan2! ⇒ Object
-
.atanh(z) ⇒ Object
returns the inverse hyperbolic tangent of
z
. - .atanh! ⇒ Object
-
.cbrt(z) ⇒ Object
Returns the principal value of the cube root of
z
. - .cbrt! ⇒ Object
-
.cos(z) ⇒ Object
Returns the cosine of
z
, wherez
is given in radians. - .cos! ⇒ Object
-
.cosh(z) ⇒ Object
Returns the hyperbolic cosine of
z
, wherez
is given in radians. - .cosh! ⇒ Object
- .erf ⇒ Object
- .erfc ⇒ Object
-
.exp(z) ⇒ Object
Math::E raised to the
z
power. - .exp! ⇒ Object
- .frexp ⇒ Object
- .gamma ⇒ Object
-
.handle_no_method_error ⇒ Object
:nodoc:.
- .hypot ⇒ Object
- .ldexp ⇒ Object
- .lgamma ⇒ Object
-
.log(z, b = ::Math::E) ⇒ Object
Returns the natural logarithm of Complex.
- .log! ⇒ Object
-
.log10(z) ⇒ Object
Returns the base 10 logarithm of
z
. - .log10! ⇒ Object
-
.log2(z) ⇒ Object
Returns the base 2 logarithm of
z
. - .log2! ⇒ Object
-
.sin(z) ⇒ Object
Returns the sine of
z
, wherez
is given in radians. - .sin! ⇒ Object
-
.sinh(z) ⇒ Object
Returns the hyperbolic sine of
z
, wherez
is given in radians. - .sinh! ⇒ Object
-
.sqrt(z) ⇒ Object
Returns the non-negative square root of Complex.
- .sqrt! ⇒ Object
-
.tan(z) ⇒ Object
Returns the tangent of
z
, wherez
is given in radians. - .tan! ⇒ Object
-
.tanh(z) ⇒ Object
Returns the hyperbolic tangent of
z
, wherez
is given in radians. - .tanh! ⇒ Object
Class Method Details
.acos(z) ⇒ Object
Returns the arc cosine of z
CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
281 282 283 284 285 286 287 288 289 290 291 |
# File 'lib/cmath.rb', line 281 def acos(z) begin if z.real? and z >= -1 and z <= 1 RealMath.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! ⇒ Object
.acosh(z) ⇒ Object
returns the inverse hyperbolic cosine of z
CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
346 347 348 349 350 351 352 353 354 355 356 |
# File 'lib/cmath.rb', line 346 def acosh(z) begin if z.real? and z >= 1 RealMath.acosh(z) else log(z + sqrt(z * z - 1.0)) end rescue NoMethodError handle_no_method_error end end |
.acosh! ⇒ Object
.asin(z) ⇒ Object
Returns the arc sine of z
CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
265 266 267 268 269 270 271 272 273 274 275 |
# File 'lib/cmath.rb', line 265 def asin(z) begin if z.real? and z >= -1 and z <= 1 RealMath.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! ⇒ Object
.asinh(z) ⇒ Object
returns the inverse hyperbolic sine of z
CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
330 331 332 333 334 335 336 337 338 339 340 |
# File 'lib/cmath.rb', line 330 def asinh(z) begin if z.real? RealMath.asinh(z) else log(z + sqrt(1.0 + z * z)) end rescue NoMethodError handle_no_method_error end end |
.asinh! ⇒ Object
.atan(z) ⇒ Object
Returns the arc tangent of z
CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
297 298 299 300 301 302 303 304 305 306 307 |
# File 'lib/cmath.rb', line 297 def atan(z) begin if z.real? RealMath.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! ⇒ Object
.atan2(y, x) ⇒ Object
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)
314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/cmath.rb', line 314 def atan2(y,x) begin if y.real? and x.real? RealMath.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! ⇒ Object
.atanh(z) ⇒ Object
returns the inverse hyperbolic tangent of z
CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
362 363 364 365 366 367 368 369 370 371 372 |
# File 'lib/cmath.rb', line 362 def atanh(z) begin if z.real? and z >= -1 and z <= 1 RealMath.atanh(z) else log((1.0 + z) / (1.0 - z)) / 2.0 end rescue NoMethodError handle_no_method_error end end |
.atanh! ⇒ Object
.cbrt(z) ⇒ Object
Returns the principal value of the cube root of z
CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
157 158 159 |
# File 'lib/cmath.rb', line 157 def cbrt(z) z ** (1.0/3) end |
.cbrt! ⇒ Object
.cos(z) ⇒ Object
Returns the cosine of z
, where z
is given in radians
CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/cmath.rb', line 182 def cos(z) begin if z.real? RealMath.cos(z) else Complex(RealMath.cos(z.real) * RealMath.cosh(z.imag), -RealMath.sin(z.real) * RealMath.sinh(z.imag)) end rescue NoMethodError handle_no_method_error end end |
.cos! ⇒ Object
.cosh(z) ⇒ Object
Returns the hyperbolic cosine of z
, where z
is given in radians
CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/cmath.rb', line 232 def cosh(z) begin if z.real? RealMath.cosh(z) else Complex(RealMath.cosh(z.real) * RealMath.cos(z.imag), RealMath.sinh(z.real) * RealMath.sin(z.imag)) end rescue NoMethodError handle_no_method_error end end |
.cosh! ⇒ Object
.erf ⇒ Object
.erfc ⇒ Object
.exp(z) ⇒ Object
Math::E raised to the z
power
CMath.exp(1.i * Math::PI) #=> (-1.0+1.2246467991473532e-16i)
62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/cmath.rb', line 62 def exp(z) begin if z.real? RealMath.exp(z) else ere = RealMath.exp(z.real) Complex(ere * RealMath.cos(z.imag), ere * RealMath.sin(z.imag)) end rescue NoMethodError handle_no_method_error end end |
.exp! ⇒ Object
.frexp ⇒ Object
.gamma ⇒ Object
.handle_no_method_error ⇒ Object
:nodoc:
426 427 428 429 430 431 432 |
# File 'lib/cmath.rb', line 426 def handle_no_method_error # :nodoc: if $!.name == :real? raise TypeError, "Numeric Number required" else raise end end |
.hypot ⇒ Object
.ldexp ⇒ Object
.lgamma ⇒ Object
.log(z, b = ::Math::E) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/cmath.rb', line 82 def log(z, b=::Math::E) begin if z.real? && z >= 0 && b >= 0 RealMath.log(z, b) else Complex(RealMath.log(z.abs), z.arg) / log(b) end rescue NoMethodError handle_no_method_error end end |
.log! ⇒ Object
.log10(z) ⇒ Object
Returns the base 10 logarithm of z
CMath.log10(-1) #=> (0.0+1.3643763538418412i)
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/cmath.rb', line 114 def log10(z) begin if z.real? and z >= 0 RealMath.log10(z) else log(z) / RealMath.log(10) end rescue NoMethodError handle_no_method_error end end |
.log10! ⇒ Object
.log2(z) ⇒ Object
Returns the base 2 logarithm of z
CMath.log2(-1) => (0.0+4.532360141827194i)
98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/cmath.rb', line 98 def log2(z) begin if z.real? and z >= 0 RealMath.log2(z) else log(z) / RealMath.log(2) end rescue NoMethodError handle_no_method_error end end |
.log2! ⇒ Object
.sin(z) ⇒ Object
Returns the sine of z
, where z
is given in radians
CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/cmath.rb', line 165 def sin(z) begin if z.real? RealMath.sin(z) else Complex(RealMath.sin(z.real) * RealMath.cosh(z.imag), RealMath.cos(z.real) * RealMath.sinh(z.imag)) end rescue NoMethodError handle_no_method_error end end |
.sin! ⇒ Object
.sinh(z) ⇒ Object
Returns the hyperbolic sine of z
, where z
is given in radians
CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/cmath.rb', line 215 def sinh(z) begin if z.real? RealMath.sinh(z) else Complex(RealMath.sinh(z.real) * RealMath.cos(z.imag), RealMath.cosh(z.real) * RealMath.sin(z.imag)) end rescue NoMethodError handle_no_method_error end end |
.sinh! ⇒ Object
.sqrt(z) ⇒ Object
Returns the non-negative square root of Complex.
CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/cmath.rb', line 130 def sqrt(z) begin if z.real? if z < 0 Complex(0, RealMath.sqrt(-z)) else RealMath.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(RealMath.sqrt((r + x) / 2.0), RealMath.sqrt((r - x) / 2.0)) end end rescue NoMethodError handle_no_method_error end end |
.sqrt! ⇒ Object
.tan(z) ⇒ Object
Returns the tangent of z
, where z
is given in radians
CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/cmath.rb', line 199 def tan(z) begin if z.real? RealMath.tan(z) else sin(z) / cos(z) end rescue NoMethodError handle_no_method_error end end |
.tan! ⇒ Object
.tanh(z) ⇒ Object
Returns the hyperbolic tangent of z
, where z
is given in radians
CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/cmath.rb', line 249 def tanh(z) begin if z.real? RealMath.tanh(z) else sinh(z) / cosh(z) end rescue NoMethodError handle_no_method_error end end |