Class: Complex
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::Numeric
|
|
|
Instance Chain:
self,
::Numeric,
::Comparable
|
|
| Inherits: | Numeric |
| Defined in: | complex.c |
Overview
A complex number can be represented as a paired real number with imaginary unit; a+bi. Where a is real part, b is imaginary part and i is imaginary unit. Real a equals complex a+0i mathematically.
Complex object can be created as literal, and also by using Kernel.Complex, .rect, .polar or to_c method.
2+1i #=> (2+1i)
Complex(1) #=> (1+0i)
Complex(2, 3) #=> (2+3i)
Complex.polar(2, 3) #=> (-1.9799849932008908+0.2822400161197344i)
3.to_c #=> (3+0i)
You can also create complex object from floating-point numbers or strings.
Complex(0.3) #=> (0.3+0i)
Complex('0.3-0.5i') #=> (0.3-0.5i)
Complex('2/3+3/4i') #=> ((2/3)+(3/4)*i)
Complex('1@2') #=> (-0.4161468365471424+0.9092974268256817i)
0.3.to_c #=> (0.3+0i)
'0.3-0.5i'.to_c #=> (0.3-0.5i)
'2/3+3/4i'.to_c #=> ((2/3)+(3/4)*i)
'1@2'.to_c #=> (-0.4161468365471424+0.9092974268256817i)
A complex object is either an exact or an inexact number.
Complex(1, 1) / 2 #=> ((1/2)+(1/2)*i)
Complex(1, 1) / 2.0 #=> (0.5+0.5i)
Constant Summary
-
I =
# File 'complex.c', line 2451
The imaginary unit.
f_complex_new_bang2(rb_cComplex, ZERO, ONE)
Class Method Summary
-
.polar(abs[, arg]) ⇒ Complex
Returns a complex object which denotes the given polar form.
-
.rect(real[, imag]) ⇒ Complex
(also: .rectangular)
Returns a complex object which denotes the given rectangular form.
-
.rectangular(real[, imag]) ⇒ Complex
Alias for .rect.
Instance Attribute Summary
-
#finite? ⇒ Boolean
readonly
Returns
trueifcmp‘s real and imaginary parts are both finite numbers, otherwise returnsfalse. -
#infinite? ⇒ Boolean
readonly
Returns
1ifcmp‘s real or imaginary part is an infinite number, otherwise returnsnil. -
#real ⇒ Numeric
readonly
Returns the real part.
-
Complex(1).real?) ⇒ Boolean
readonly
Returns false, even if the complex number has no imaginary part.
::Numeric - Inherited
| #finite? | Returns |
| #infinite? | Returns |
| #integer? | Returns |
| #negative? | Returns |
| #nonzero? | Returns |
| #positive? | Returns |
| #real | Returns self. |
| #real? | Returns |
| #zero? | Returns |
Instance Method Summary
-
#*(numeric) ⇒ Complex
Performs multiplication.
-
#**(numeric) ⇒ Complex
Performs exponentiation.
-
#+(numeric) ⇒ Complex
Performs addition.
-
#-(numeric) ⇒ Complex
Performs subtraction.
-
#- ⇒ Complex
Returns negation of the value.
-
#/(numeric) ⇒ Complex
Performs division.
-
#<=>(object) ⇒ 0, ...
If
cmp‘s imaginary part is zero, andobjectis also a real number (or aComplexnumber where the imaginary part is zero), compare the real part ofcmpto object. -
#==(object) ⇒ Boolean
Returns true if cmp equals object numerically.
-
#abs ⇒ Numeric
(also: #magnitude)
Returns the absolute part of its polar form.
-
#abs2 ⇒ Numeric
Returns square of the absolute value.
-
#angle ⇒ Float
Alias for #arg.
-
#arg ⇒ Float
(also: #angle, #phase)
Returns the angle part of its polar form.
-
#conj ⇒ Complex
(also: #conjugate)
Returns the complex conjugate.
-
#conjugate ⇒ Complex
Alias for #conj.
-
#denominator ⇒ Integer
Returns the denominator (lcm of both denominator - real and imag).
-
#fdiv(numeric) ⇒ Complex
Performs division as each part is a float, never returns a float.
- #hash
-
#imag ⇒ Numeric
(also: #imaginary)
Returns the imaginary part.
-
#imaginary ⇒ Numeric
Alias for #imag.
-
#inspect ⇒ String
Returns the value as a string for inspection.
-
#magnitude ⇒ Numeric
Alias for #abs.
-
#numerator ⇒ Numeric
Returns the numerator.
-
#phase ⇒ Float
Alias for #arg.
-
#polar ⇒ Array
Returns an array; [cmp.abs, cmp.arg].
- #quo
-
#rationalize([eps]) ⇒ Rational
Returns the value as a rational if possible (the imaginary part should be exactly zero).
-
#rect ⇒ Array
(also: #rectangular)
Returns an array; [cmp.real, cmp.imag].
-
#rectangular ⇒ Array
Alias for #rect.
-
#to_c ⇒ self
Returns self.
-
#to_f ⇒ Float
Returns the value as a float if possible (the imaginary part should be exactly zero).
-
#to_i ⇒ Integer
Returns the value as an integer if possible (the imaginary part should be exactly zero).
-
#to_r ⇒ Rational
Returns the value as a rational if possible (the imaginary part should be exactly zero).
-
#to_s ⇒ String
Returns the value as a string.
- #coerce(other) Internal use only
- #eql?(other) ⇒ Boolean Internal use only
- #marshal_dump private Internal use only
::Numeric - Inherited
| #% |
|
| #+@ | Unary Plus—Returns the receiver. |
| #-@ | Unary Minus—Returns the receiver, negated. |
| #<=> | Returns zero if |
| #abs | Returns the absolute value of |
| #abs2 | Returns square of self. |
| #angle | Alias for Numeric#arg. |
| #arg | Returns 0 if the value is positive, pi otherwise. |
| #ceil | Returns the smallest number greater than or equal to |
| #clone | Returns the receiver. |
| #coerce | If |
| #conj | Returns self. |
| #conjugate | Alias for Numeric#conj. |
| #denominator | Returns the denominator (always positive). |
| #div | Uses |
| #divmod | Returns an array containing the quotient and modulus obtained by dividing |
| #dup | Returns the receiver. |
| #eql? | Returns |
| #fdiv | Returns float division. |
| #floor | Returns the largest number less than or equal to |
| #i | Returns the corresponding imaginary number. |
| #imag | Returns zero. |
| #imaginary | Alias for Numeric#imag. |
| #magnitude | Alias for Numeric#abs. |
| #modulo | Alias for Numeric#%. |
| #numerator | Returns the numerator. |
| #phase | Alias for Numeric#arg. |
| #polar | Returns an array; [num.abs, num.arg]. |
| #quo | Returns the most exact division (rational for integers, float for floats). |
| #rect | Returns an array; [num, 0]. |
| #rectangular | Alias for Numeric#rect. |
| #remainder |
|
| #round | Returns |
| #step | Invokes the given block with the sequence of numbers starting at |
| #to_c | Returns the value as a complex. |
| #to_int | Invokes the child class’s #to_i method to convert |
| #truncate | Returns |
| #singleton_method_added | Trap attempts to add methods to |
::Comparable - Included
| #< | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than 0. |
| #<= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than or equal to 0. |
| #== | Compares two objects based on the receiver’s #<=> method, returning true if it returns 0. |
| #> | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than 0. |
| #>= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than or equal to 0. |
| #between? | |
| #clamp |
Class Method Details
.polar(abs[, arg]) ⇒ Complex
# File 'complex.c', line 700
static VALUE
nucomp_s_polar(int argc, VALUE *argv, VALUE klass)
{
VALUE abs, arg;
switch (rb_scan_args(argc, argv, "11", &abs, &arg)) {
case 1:
nucomp_real_check(abs);
return nucomp_s_new_internal(klass, abs, ZERO);
default:
nucomp_real_check(abs);
nucomp_real_check(arg);
break;
}
if (RB_TYPE_P(abs, T_COMPLEX)) {
get_dat1(abs);
abs = dat->real;
}
if (RB_TYPE_P(arg, T_COMPLEX)) {
get_dat1(arg);
arg = dat->real;
}
return f_complex_polar(klass, abs, arg);
}
.rect(real[, imag]) ⇒ Complex
.rectangular(real[, imag]) ⇒ Complex
Also known as: .rectangular
Complex
.rectangular(real[, imag]) ⇒ Complex
Returns a complex object which denotes the given rectangular form.
Complex.rectangular(1, 2) #=> (1+2i)
# File 'complex.c', line 484
static VALUE
nucomp_s_new(int argc, VALUE *argv, VALUE klass)
{
VALUE real, imag;
switch (rb_scan_args(argc, argv, "11", &real, &imag)) {
case 1:
nucomp_real_check(real);
imag = ZERO;
break;
default:
nucomp_real_check(real);
nucomp_real_check(imag);
break;
}
return nucomp_s_canonicalize_internal(klass, real, imag);
}
.rect(real[, imag]) ⇒ Complex
.rectangular(real[, imag]) ⇒ Complex
Complex
.rectangular(real[, imag]) ⇒ Complex
Alias for .rect.
Instance Attribute Details
#finite? ⇒ Boolean (readonly)
Returns true if cmp‘s real and imaginary parts are both finite numbers, otherwise returns false.
# File 'complex.c', line 1455
static VALUE
rb_complex_finite_p(VALUE self)
{
get_dat1(self);
if (f_finite_p(dat->real) && f_finite_p(dat->imag)) {
return Qtrue;
}
return Qfalse;
}
#infinite? ⇒ Boolean (readonly)
# File 'complex.c', line 1478
static VALUE
rb_complex_infinite_p(VALUE self)
{
get_dat1(self);
if (NIL_P(f_infinite_p(dat->real)) && NIL_P(f_infinite_p(dat->imag))) {
return Qnil;
}
return ONE;
}
#real ⇒ Numeric (readonly)
Returns the real part.
Complex(7).real #=> 7
Complex(9, -4).real #=> 9
# File 'complex.c', line 734
VALUE
rb_complex_real(VALUE self)
{
get_dat1(self);
return dat->real;
}
Complex(1).real?) ⇒ Boolean (readonly)
Complex(1, 2).real?) ⇒ Boolean
Boolean (readonly)
Complex(1, 2).real?) ⇒ Boolean
Returns false, even if the complex number has no imaginary part.
# File 'complex.c', line 1276
static VALUE
nucomp_false(VALUE self)
{
return Qfalse;
}
Instance Method Details
#*(numeric) ⇒ Complex
Performs multiplication.
Complex(2, 3) * Complex(2, 3) #=> (-5+12i)
Complex(900) * Complex(1) #=> (900+0i)
Complex(-2, 9) * Complex(-9, 2) #=> (0-85i)
Complex(9, 8) * 4 #=> (36+32i)
Complex(20, 9) * 9.8 #=> (196.0+88.2i)
# File 'complex.c', line 880
VALUE
rb_complex_mul(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX)) {
VALUE real, imag;
get_dat2(self, other);
comp_mul(adat->real, adat->imag, bdat->real, bdat->imag, &real, &imag);
return f_complex_new2(CLASS_OF(self), real, imag);
}
if (k_numeric_p(other) && f_real_p(other)) {
get_dat1(self);
return f_complex_new2(CLASS_OF(self),
f_mul(dat->real, other),
f_mul(dat->imag, other));
}
return rb_num_coerce_bin(self, other, '*');
}
#**(numeric) ⇒ Complex
Performs exponentiation.
Complex('i') ** 2 #=> (-1+0i)
Complex(-8) ** Rational(1, 3) #=> (1.0000000000000002+1.7320508075688772i)
# File 'complex.c', line 993
VALUE
rb_complex_pow(VALUE self, VALUE other)
{
if (k_numeric_p(other) && k_exact_zero_p(other))
return f_complex_new_bang1(CLASS_OF(self), ONE);
if (RB_TYPE_P(other, T_RATIONAL) && RRATIONAL(other)->den == LONG2FIX(1))
other = RRATIONAL(other)->num; /* c14n */
if (RB_TYPE_P(other, T_COMPLEX)) {
get_dat1(other);
if (k_exact_zero_p(dat->imag))
other = dat->real; /* c14n */
}
if (RB_TYPE_P(other, T_COMPLEX)) {
VALUE r, theta, nr, ntheta;
get_dat1(other);
r = f_abs(self);
theta = f_arg(self);
nr = m_exp_bang(f_sub(f_mul(dat->real, m_log_bang(r)),
f_mul(dat->imag, theta)));
ntheta = f_add(f_mul(theta, dat->real),
f_mul(dat->imag, m_log_bang(r)));
return f_complex_polar(CLASS_OF(self), nr, ntheta);
}
if (FIXNUM_P(other)) {
long n = FIX2LONG(other);
if (n == 0) {
return nucomp_s_new_internal(CLASS_OF(self), ONE, ZERO);
}
if (n < 0) {
self = f_reciprocal(self);
other = rb_int_uminus(other);
n = -n;
}
{
get_dat1(self);
VALUE xr = dat->real, xi = dat->imag, zr = xr, zi = xi;
if (f_zero_p(xi)) {
zr = rb_num_pow(zr, other);
}
else if (f_zero_p(xr)) {
zi = rb_num_pow(zi, other);
if (n & 2) zi = f_negate(zi);
if (!(n & 1)) {
VALUE tmp = zr;
zr = zi;
zi = tmp;
}
}
else {
while (--n) {
long q, r;
for (; q = n / 2, r = n % 2, r == 0; n = q) {
VALUE tmp = f_sub(f_mul(xr, xr), f_mul(xi, xi));
xi = f_mul(f_mul(TWO, xr), xi);
xr = tmp;
}
comp_mul(zr, zi, xr, xi, &zr, &zi);
}
}
return nucomp_s_new_internal(CLASS_OF(self), zr, zi);
}
}
if (k_numeric_p(other) && f_real_p(other)) {
VALUE r, theta;
if (RB_TYPE_P(other, T_BIGNUM))
rb_warn("in a**b, b may be too big");
r = f_abs(self);
theta = f_arg(self);
return f_complex_polar(CLASS_OF(self), f_expt(r, other),
f_mul(theta, other));
}
return rb_num_coerce_bin(self, other, id_expt);
}
#+(numeric) ⇒ Complex
Performs addition.
Complex(2, 3) + Complex(2, 3) #=> (4+6i)
Complex(900) + Complex(1) #=> (901+0i)
Complex(-2, 9) + Complex(-9, 2) #=> (-11+11i)
Complex(9, 8) + 4 #=> (13+8i)
Complex(20, 9) + 9.8 #=> (29.8+9i)
# File 'complex.c', line 786
VALUE
rb_complex_plus(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX)) {
VALUE real, imag;
get_dat2(self, other);
real = f_add(adat->real, bdat->real);
imag = f_add(adat->imag, bdat->imag);
return f_complex_new2(CLASS_OF(self), real, imag);
}
if (k_numeric_p(other) && f_real_p(other)) {
get_dat1(self);
return f_complex_new2(CLASS_OF(self),
f_add(dat->real, other), dat->imag);
}
return rb_num_coerce_bin(self, other, '+');
}
#-(numeric) ⇒ Complex
Performs subtraction.
Complex(2, 3) - Complex(2, 3) #=> (0+0i)
Complex(900) - Complex(1) #=> (899+0i)
Complex(-2, 9) - Complex(-9, 2) #=> (7+7i)
Complex(9, 8) - 4 #=> (5+8i)
Complex(20, 9) - 9.8 #=> (10.2+9i)
# File 'complex.c', line 820
VALUE
rb_complex_minus(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX)) {
VALUE real, imag;
get_dat2(self, other);
real = f_sub(adat->real, bdat->real);
imag = f_sub(adat->imag, bdat->imag);
return f_complex_new2(CLASS_OF(self), real, imag);
}
if (k_numeric_p(other) && f_real_p(other)) {
get_dat1(self);
return f_complex_new2(CLASS_OF(self),
f_sub(dat->real, other), dat->imag);
}
return rb_num_coerce_bin(self, other, '-');
}
#- ⇒ Complex
Returns negation of the value.
-Complex(1, 2) #=> (-1-2i)
# File 'complex.c', line 766
VALUE
rb_complex_uminus(VALUE self)
{
get_dat1(self);
return f_complex_new2(CLASS_OF(self),
f_negate(dat->real), f_negate(dat->imag));
}
#/(numeric) ⇒ Complex
#quo(numeric) ⇒ Complex
Complex
#quo(numeric) ⇒ Complex
Performs division.
Complex(2, 3) / Complex(2, 3) #=> ((1/1)+(0/1)*i)
Complex(900) / Complex(1) #=> ((900/1)+(0/1)*i)
Complex(-2, 9) / Complex(-9, 2) #=> ((36/85)-(77/85)*i)
Complex(9, 8) / 4 #=> ((9/4)+(2/1)*i)
Complex(20, 9) / 9.8 #=> (2.0408163265306123+0.9183673469387754i)
# File 'complex.c', line 956
VALUE
rb_complex_div(VALUE self, VALUE other)
{
return f_divide(self, other, f_quo, id_quo);
}
#<=>(object) ⇒ 0, ...
If cmp‘s imaginary part is zero, and object is also a real number (or a Complex number where the imaginary part is zero), compare the real part of cmp to object. Otherwise, return nil.
Complex(2, 3) <=> Complex(2, 3) #=> nil
Complex(2, 3) <=> 1 #=> nil
Complex(2) <=> 1 #=> 1
Complex(2) <=> 2 #=> 0
Complex(2) <=> 3 #=> -1
# File 'complex.c', line 1129
static VALUE
nucomp_cmp(VALUE self, VALUE other)
{
if (nucomp_real_p(self) && k_numeric_p(other)) {
if (RB_TYPE_P(other, T_COMPLEX) && nucomp_real_p(other)) {
get_dat2(self, other);
return rb_funcall(adat->real, idCmp, 1, bdat->real);
}
else if (f_real_p(other)) {
get_dat1(self);
return rb_funcall(dat->real, idCmp, 1, other);
}
}
return Qnil;
}
#==(object) ⇒ Boolean
Returns true if cmp equals object numerically.
Complex(2, 3) == Complex(2, 3) #=> true
Complex(5) == 5 #=> true
Complex(0) == 0.0 #=> true
Complex('1/3') == 0.33 #=> false
Complex('1/2') == '1/2' #=> false
# File 'complex.c', line 1091
static VALUE
nucomp_eqeq_p(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX)) {
get_dat2(self, other);
return f_boolcast(f_eqeq_p(adat->real, bdat->real) &&
f_eqeq_p(adat->imag, bdat->imag));
}
if (k_numeric_p(other) && f_real_p(other)) {
get_dat1(self);
return f_boolcast(f_eqeq_p(dat->real, other) && f_zero_p(dat->imag));
}
return f_boolcast(f_eqeq_p(other, self));
}
Also known as: #magnitude
Returns the absolute part of its polar form.
Complex(-1).abs #=> 1
Complex(3.0, -4.0).abs #=> 5.0
# File 'complex.c', line 1169
VALUE
rb_complex_abs(VALUE self)
{
get_dat1(self);
if (f_zero_p(dat->real)) {
VALUE a = f_abs(dat->imag);
if (RB_FLOAT_TYPE_P(dat->real) && !RB_FLOAT_TYPE_P(dat->imag))
a = f_to_f(a);
return a;
}
if (f_zero_p(dat->imag)) {
VALUE a = f_abs(dat->real);
if (!RB_FLOAT_TYPE_P(dat->real) && RB_FLOAT_TYPE_P(dat->imag))
a = f_to_f(a);
return a;
}
return rb_math_hypot(dat->real, dat->imag);
}
#abs2 ⇒ Numeric
Returns square of the absolute value.
Complex(-1).abs2 #=> 1
Complex(3.0, -4.0).abs2 #=> 25.0
# File 'complex.c', line 1198
static VALUE
nucomp_abs2(VALUE self)
{
get_dat1(self);
return f_add(f_mul(dat->real, dat->real),
f_mul(dat->imag, dat->imag));
}
Alias for #arg.
Also known as: #angle, #phase
[ GitHub ]# File 'complex.c', line 1216
VALUE
rb_complex_arg(VALUE self)
{
get_dat1(self);
return rb_math_atan2(dat->imag, dat->real);
}
#coerce(other)
# File 'complex.c', line 1146
static VALUE
nucomp_coerce(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX))
return rb_assoc_new(other, self);
if (k_numeric_p(other) && f_real_p(other))
return rb_assoc_new(f_complex_new_bang1(CLASS_OF(self), other), self);
rb_raise(rb_eTypeError, "%"PRIsVALUE" can't be coerced into %"PRIsVALUE,
rb_obj_class(other), rb_obj_class(self));
return Qnil;
}
#conj ⇒ Complex
#conjugate ⇒ Complex
Also known as: #conjugate
Complex
#conjugate ⇒ Complex
Returns the complex conjugate.
Complex(1, 2).conjugate #=> (1-2i)
# File 'complex.c', line 1262
VALUE
rb_complex_conjugate(VALUE self)
{
get_dat1(self);
return f_complex_new2(CLASS_OF(self), dat->real, f_negate(dat->imag));
}
#conj ⇒ Complex
#conjugate ⇒ Complex
Complex
#conjugate ⇒ Complex
Alias for #conj.
#denominator ⇒ Integer
Returns the denominator (lcm of both denominator - real and imag).
See numerator.
# File 'complex.c', line 1290
static VALUE
nucomp_denominator(VALUE self)
{
get_dat1(self);
return rb_lcm(f_denominator(dat->real), f_denominator(dat->imag));
}
#eql?(other) ⇒ Boolean
# File 'complex.c', line 1353
static VALUE
nucomp_eql_p(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_COMPLEX)) {
get_dat2(self, other);
return f_boolcast((CLASS_OF(adat->real) == CLASS_OF(bdat->real)) &&
(CLASS_OF(adat->imag) == CLASS_OF(bdat->imag)) &&
f_eqeq_p(self, other));
}
return Qfalse;
}
#fdiv(numeric) ⇒ Complex
Performs division as each part is a float, never returns a float.
Complex(11, 22).fdiv(3) #=> (3.6666666666666665+7.333333333333333i)
# File 'complex.c', line 972
static VALUE
nucomp_fdiv(VALUE self, VALUE other)
{
return f_divide(self, other, f_fdiv, id_fdiv);
}
#hash
[ GitHub ]# File 'complex.c', line 1346
static VALUE
nucomp_hash(VALUE self)
{
return ST2FIX(rb_complex_hash(self));
}
Also known as: #imaginary
[ GitHub ]# File 'complex.c', line 751
VALUE
rb_complex_imag(VALUE self)
{
get_dat1(self);
return dat->imag;
}
Alias for #imag.
#inspect ⇒ String
# File 'complex.c', line 1434
static VALUE
nucomp_inspect(VALUE self)
{
VALUE s;
s = rb_usascii_str_new2("(");
rb_str_concat(s, f_format(self, rb_inspect));
rb_str_cat2(s, ")");
return s;
}
Alias for #abs.
#marshal_dump (private)
# File 'complex.c', line 1510
static VALUE
nucomp_marshal_dump(VALUE self)
{
VALUE a;
get_dat1(self);
a = rb_assoc_new(dat->real, dat->imag);
rb_copy_generic_ivar(a, self);
return a;
}
#numerator ⇒ Numeric
Returns the numerator.
1 2 3+4i <- numerator
- + -i -> ----
2 3 6 <- denominator
c = Complex('1/2+2/3i') #=> ((1/2)+(2/3)*i)
n = c.numerator #=> (3+4i)
d = c.denominator #=> 6
n / d #=> ((1/2)+(2/3)*i)
Complex(Rational(n.real, d), Rational(n.imag, d))
#=> ((1/2)+(2/3)*i)
See denominator.
# File 'complex.c', line 1315
static VALUE
nucomp_numerator(VALUE self)
{
VALUE cd;
get_dat1(self);
cd = nucomp_denominator(self);
return f_complex_new2(CLASS_OF(self),
f_mul(f_numerator(dat->real),
f_div(cd, f_denominator(dat->real))),
f_mul(f_numerator(dat->imag),
f_div(cd, f_denominator(dat->imag))));
}
Alias for #arg.
#polar ⇒ Array
Returns an array; [cmp.abs, cmp.arg].
Complex(1, 2).polar #=> [2.23606797749979, 1.1071487177940904]
# File 'complex.c', line 1247
static VALUE
nucomp_polar(VALUE self)
{
return rb_assoc_new(f_abs(self), f_arg(self));
}
#quo
[ GitHub ]#rationalize([eps]) ⇒ Rational
Returns the value as a rational if possible (the imaginary part should be exactly zero).
Complex(1.0/3, 0).rationalize #=> (1/3)
Complex(1, 0.0).rationalize # RangeError
Complex(1, 2).rationalize # RangeError
See to_r.
# File 'complex.c', line 1665
static VALUE
nucomp_rationalize(int argc, VALUE *argv, VALUE self)
{
get_dat1(self);
rb_check_arity(argc, 0, 1);
if (!k_exact_zero_p(dat->imag)) {
rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Rational",
self);
}
return rb_funcallv(dat->real, id_rationalize, argc, argv);
}
Also known as: #rectangular
Returns an array; [cmp.real, cmp.imag].
Complex(1, 2).rectangular #=> [1, 2]
# File 'complex.c', line 1232
static VALUE
nucomp_rect(VALUE self)
{
get_dat1(self);
return rb_assoc_new(dat->real, dat->imag);
}
Alias for #rect.
#to_c ⇒ self
Returns self.
Complex(2).to_c #=> (2+0i)
Complex(-8, 6).to_c #=> (-8+6i)
# File 'complex.c', line 1688
static VALUE
nucomp_to_c(VALUE self)
{
return self;
}
#to_f ⇒ Float
Returns the value as a float if possible (the imaginary part should be exactly zero).
Complex(1, 0).to_f #=> 1.0
Complex(1, 0.0).to_f # RangeError
Complex(1, 2).to_f # RangeError
# File 'complex.c', line 1615
static VALUE
nucomp_to_f(VALUE self)
{
get_dat1(self);
if (!k_exact_zero_p(dat->imag)) {
rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Float",
self);
}
return f_to_f(dat->real);
}
#to_i ⇒ Integer
Returns the value as an integer if possible (the imaginary part should be exactly zero).
Complex(1, 0).to_i #=> 1
Complex(1, 0.0).to_i # RangeError
Complex(1, 2).to_i # RangeError
# File 'complex.c', line 1592
static VALUE
nucomp_to_i(VALUE self)
{
get_dat1(self);
if (!k_exact_zero_p(dat->imag)) {
rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Integer",
self);
}
return f_to_i(dat->real);
}
#to_r ⇒ Rational
Returns the value as a rational if possible (the imaginary part should be exactly zero).
Complex(1, 0).to_r #=> (1/1)
Complex(1, 0.0).to_r # RangeError
Complex(1, 2).to_r # RangeError
See rationalize.
# File 'complex.c', line 1640
static VALUE
nucomp_to_r(VALUE self)
{
get_dat1(self);
if (!k_exact_zero_p(dat->imag)) {
rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Rational",
self);
}
return f_to_r(dat->real);
}
#to_s ⇒ String
# File 'complex.c', line 1416
static VALUE
nucomp_to_s(VALUE self)
{
return f_format(self, rb_String);
}