Complex 类

Complex 对象包含一对值,在创建对象时以直角坐标极坐标形式给出。

直角坐标

复数的直角坐标称为实部虚部;参见 复数定义.

您可以使用以下方法从直角坐标创建 Complex 对象:

请注意,每个存储的部分都可能是 ComplexFloatIntegerRational 类的实例;它们可以被检索

相应的(计算的)极坐标值可以被检索

极坐标

复数的极坐标称为幅角;参见 复数极坐标平面.

在本类中,参数部分以弧度(而非度数)表示。

您可以使用以下方法从极坐标创建 Complex 对象:

请注意,每个存储的部分都可能是 ComplexFloatIntegerRational 类的实例;它们可以被检索

相应的(计算的)矩形值可以通过以下方法单独获取:

常量

I

等效于 Complex(0, 1)

Complex::I # => (0+1i)

公共类方法

polar(abs, arg = 0) → complex 点击切换源代码

返回一个由参数组成的新的 Complex 对象,每个参数必须是 Numeric 的实例,或其子类的实例:Complex、FloatIntegerRational。参数 arg 以弧度表示;请参阅 极坐标

Complex.polar(3)        # => (3+0i)
Complex.polar(3, 2.0)   # => (-1.2484405096414273+2.727892280477045i)
Complex.polar(-3, -2.0) # => (1.2484405096414273+2.727892280477045i)
static VALUE
nucomp_s_polar(int argc, VALUE *argv, VALUE klass)
{
    VALUE abs, arg;

    argc = rb_scan_args(argc, argv, "11", &abs, &arg);
    abs = nucomp_real_check(abs);
    if (argc == 2) {
        arg = nucomp_real_check(arg);
    }
    else {
        arg = ZERO;
    }
    return f_complex_polar_real(klass, abs, arg);
}
rect(real, imag = 0) → complex 点击切换源代码

返回一个由参数组成的新的 Complex 对象,每个参数必须是 Numeric 的实例,或其子类的实例:Complex、FloatIntegerRational;请参阅 矩形坐标

Complex.rect(3)             # => (3+0i)
Complex.rect(3, Math::PI)   # => (3+3.141592653589793i)
Complex.rect(-3, -Math::PI) # => (-3-3.141592653589793i)

Complex.rectangular 是 Complex.rect 的别名。

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:
        real = nucomp_real_check(real);
        imag = ZERO;
        break;
      default:
        real = nucomp_real_check(real);
        imag = nucomp_real_check(imag);
        break;
    }

    return nucomp_s_new_internal(klass, real, imag);
}
rect(real, imag = 0) → complex 点击切换源代码

返回一个由参数组成的新的 Complex 对象,每个参数必须是 Numeric 的实例,或其子类的实例:Complex、FloatIntegerRational;请参阅 矩形坐标

Complex.rect(3)             # => (3+0i)
Complex.rect(3, Math::PI)   # => (3+3.141592653589793i)
Complex.rect(-3, -Math::PI) # => (-3-3.141592653589793i)

Complex.rectangular 是 Complex.rect 的别名。

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:
        real = nucomp_real_check(real);
        imag = ZERO;
        break;
      default:
        real = nucomp_real_check(real);
        imag = nucomp_real_check(imag);
        break;
    }

    return nucomp_s_new_internal(klass, real, imag);
}

公共实例方法

complex * numeric → new_complex 点击切换源代码

返回 selfnumeric 的乘积

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)
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, '*');
}
complex ** numeric → new_complex 点击切换源代码

返回 selfnumeric 次方

Complex('i') ** 2             # => (-1+0i)
Complex(-8) ** Rational(1, 3) # => (1.0000000000000002+1.7320508075688772i)
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 (other == ONE) {
        get_dat1(self);
        return nucomp_s_new_internal(CLASS_OF(self), dat->real, dat->imag);
    }

    VALUE result = complex_pow_for_special_angle(self, other);
    if (result != Qundef) return result;

    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_BIGNUM_TYPE_P(other))
            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);
}
complex + numeric → new_complex 点击切换源代码

返回 selfnumeric 的和

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)
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, '+');
}
complex - numeric → new_complex 点击切换源代码

返回 selfnumeric 的差

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)
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 → new_complex 点击切换源代码

返回 self 的相反数,即其各个部分的相反数

-Complex(1, 2)   # => (-1-2i)
-Complex(-1, -2) # => (1+2i)
VALUE
rb_complex_uminus(VALUE self)
{
    get_dat1(self);
    return f_complex_new2(CLASS_OF(self),
                          f_negate(dat->real), f_negate(dat->imag));
}
complex / numeric → new_complex 点击切换源代码

返回selfnumeric 的商

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)
VALUE
rb_complex_div(VALUE self, VALUE other)
{
    return f_divide(self, other, f_quo, id_quo);
}
complex <=> object → -1, 0, 1, 或 nil 点击切换源代码

返回值

  • self.real <=> object.real 如果以下两个条件都满足

    • self.imag == 0.

    • object.imag == 0。# 如果 object 是数值类型但不是复数,则始终为真。

  • 否则返回 nil

示例

Complex(2) <=> 3             # => -1
Complex(2) <=> 2             # => 0
Complex(2) <=> 1             # => 1
Complex(2, 1) <=> 1          # => nil # self.imag not zero.
Complex(1) <=> Complex(1, 1) # => nil # object.imag not zero.
Complex(1) <=> 'Foo'         # => nil # object.imag not defined.
static VALUE
nucomp_cmp(VALUE self, VALUE other)
{
    if (!k_numeric_p(other)) {
        return rb_num_coerce_cmp(self, other, idCmp);
    }
    if (!nucomp_real_p(self)) {
        return Qnil;
    }
    if (RB_TYPE_P(other, T_COMPLEX)) {
        if (nucomp_real_p(other)) {
            get_dat2(self, other);
            return rb_funcall(adat->real, idCmp, 1, bdat->real);
        }
    }
    else {
        get_dat1(self);
        if (f_real_p(other)) {
            return rb_funcall(dat->real, idCmp, 1, other);
        }
        else {
            return rb_num_coerce_cmp(dat->real, other, idCmp);
        }
    }
    return Qnil;
}
complex == object → true 或 false 点击切换源代码

如果 self.real == object.realself.imag == object.imag,则返回 true

Complex(2, 3)  == Complex(2.0, 3.0)      # => true
static VALUE
nucomp_eqeq_p(VALUE self, VALUE other)
{
    if (RB_TYPE_P(other, T_COMPLEX)) {
        get_dat2(self, other);

        return RBOOL(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 RBOOL(f_eqeq_p(dat->real, other) && f_zero_p(dat->imag));
    }
    return RBOOL(f_eqeq_p(other, self));
}
abs → float 点击切换源代码

返回 self 的绝对值(幅度);参见 极坐标

Complex.polar(-1, 0).abs # => 1.0

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.rectangular(1, 1).abs # => 1.4142135623730951 # The square root of 2.
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);
}
别名:magnitude
abs2 → float 点击切换源代码

返回 self 的绝对值(幅度)的平方;参见 极坐标

Complex.polar(2, 2).abs2 # => 4.0

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.rectangular(1.0/3, 1.0/3).abs2 # => 0.2222222222222222
static VALUE
nucomp_abs2(VALUE self)
{
    get_dat1(self);
    return f_add(f_mul(dat->real, dat->real),
                 f_mul(dat->imag, dat->imag));
}
angle()

返回 self 的辐角(角度),以弧度为单位;参见 极坐标

Complex.polar(3, Math::PI/2).arg  # => 1.57079632679489660

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.polar(1, 1.0/3).arg # => 0.33333333333333326
别名:arg
arg → float 点击切换源代码

返回 self 的辐角(角度),以弧度为单位;参见 极坐标

Complex.polar(3, Math::PI/2).arg  # => 1.57079632679489660

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.polar(1, 1.0/3).arg # => 0.33333333333333326
VALUE
rb_complex_arg(VALUE self)
{
    get_dat1(self);
    return rb_math_atan2(dat->imag, dat->real);
}
别名:anglephase
conj → complex

返回 self 的共轭复数,Complex.rect(self.imag, self.real)

Complex.rect(1, 2).conj # => (1-2i)
别名:conjugate
conjugate -> complex 点击切换源代码

返回 self 的共轭复数,Complex.rect(self.imag, self.real)

Complex.rect(1, 2).conj # => (1-2i)
VALUE
rb_complex_conjugate(VALUE self)
{
    get_dat1(self);
    return f_complex_new2(CLASS_OF(self), dat->real, f_negate(dat->imag));
}
别名:conj
denominator → integer 点击切换源代码

返回 self 的分母,即 self.real.denominatorself.imag.denominator最小公倍数

Complex.rect(Rational(1, 2), Rational(2, 3)).denominator # => 6

请注意,非有理数的 n.denominator1

相关:Complex#numerator

static VALUE
nucomp_denominator(VALUE self)
{
    get_dat1(self);
    return rb_lcm(f_denominator(dat->real), f_denominator(dat->imag));
}
fdiv(numeric) → new_complex 点击切换源代码

返回 Complex(self.real/numeric, self.imag/numeric)

Complex(11, 22).fdiv(3) # => (3.6666666666666665+7.333333333333333i)
static VALUE
nucomp_fdiv(VALUE self, VALUE other)
{
    return f_divide(self, other, f_fdiv, id_fdiv);
}
finite? → true 或 false 点击切换源代码

如果 self.real.finite?self.imag.finite? 都为真,则返回 true,否则返回 false

Complex(1, 1).finite?               # => true
Complex(Float::INFINITY, 0).finite? # => false

相关:Numeric#finite?Float#finite?.

static VALUE
rb_complex_finite_p(VALUE self)
{
    get_dat1(self);

    return RBOOL(f_finite_p(dat->real) && f_finite_p(dat->imag));
}
hash → integer 点击切换源代码

返回 self 的整数哈希值。

从相同值创建的两个 Complex 对象将具有相同的哈希值(并且将使用 eql? 进行比较)

Complex(1, 2).hash == Complex(1, 2).hash # => true
static VALUE
nucomp_hash(VALUE self)
{
    return ST2FIX(rb_complex_hash(self));
}
imag → numeric

返回 self 的虚部值

Complex(7).imaginary      #=> 0
Complex(9, -4).imaginary  #=> -4

如果 self 是使用 极坐标 创建的,则返回的值是计算的,可能不精确

Complex.polar(1, Math::PI/4).imag # => 0.7071067811865476 # Square root of 2.
别名:imaginary
imaginary -> numeric 点击切换源代码

返回 self 的虚部值

Complex(7).imaginary      #=> 0
Complex(9, -4).imaginary  #=> -4

如果 self 是使用 极坐标 创建的,则返回的值是计算的,可能不精确

Complex.polar(1, Math::PI/4).imag # => 0.7071067811865476 # Square root of 2.
VALUE
rb_complex_imag(VALUE self)
{
    get_dat1(self);
    return dat->imag;
}
也称为:imag
infinite? → 1 或 nil 点击切换源代码

如果 self.real.infinite?self.imag.infinite? 为真,则返回 1,否则返回 nil

Complex(Float::INFINITY, 0).infinite? # => 1
Complex(1, 1).infinite?               # => nil

相关:Numeric#infinite?Float#infinite?.

static VALUE
rb_complex_infinite_p(VALUE self)
{
    get_dat1(self);

    if (!f_infinite_p(dat->real) && !f_infinite_p(dat->imag)) {
        return Qnil;
    }
    return ONE;
}
inspect → string 点击切换源代码

返回 self 的字符串表示形式

Complex(2).inspect                      # => "(2+0i)"
Complex('-8/6').inspect                 # => "((-4/3)+0i)"
Complex('1/2i').inspect                 # => "(0+(1/2)*i)"
Complex(0, Float::INFINITY).inspect     # => "(0+Infinity*i)"
Complex(Float::NAN, Float::NAN).inspect # => "(NaN+NaN*i)"
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;
}
magnitude()

返回 self 的绝对值(幅度);参见 极坐标

Complex.polar(-1, 0).abs # => 1.0

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.rectangular(1, 1).abs # => 1.4142135623730951 # The square root of 2.
别名:abs
numerator → new_complex 点击切换源代码

返回从 self 的实部和虚部的分子创建的 Complex 对象,在将每个部分转换为两个部分的 最小公分母 之后

c = Complex(Rational(2, 3), Rational(3, 4)) # => ((2/3)+(3/4)*i)
c.numerator                                 # => (8+9i)

在这个例子中,两个部分的最小公分母是 12;两个转换后的部分可以看作是 Rational(8, 12) 和 Rational(9, 12),它们的分母分别是 8 和 9;所以 c.numerator 的返回值是 Complex(8, 9)

相关:Complex#denominator.

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))));
}
phase()

返回 self 的辐角(角度),以弧度为单位;参见 极坐标

Complex.polar(3, Math::PI/2).arg  # => 1.57079632679489660

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.polar(1, 1.0/3).arg # => 0.33333333333333326
别名:arg
polar → array 点击切换源代码

返回数组 [self.abs, self.arg]

Complex.polar(1, 2).polar # => [1.0, 2.0]

参见 极坐标.

如果 self 是使用 直角坐标 创建的,则返回的值是计算出来的,可能不精确

Complex.rect(1, 1).polar # => [1.4142135623730951, 0.7853981633974483]
static VALUE
nucomp_polar(VALUE self)
{
    return rb_assoc_new(f_abs(self), f_arg(self));
}
complex / numeric → new_complex 点击切换源代码

返回selfnumeric 的商

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)
VALUE
rb_complex_div(VALUE self, VALUE other)
{
    return f_divide(self, other, f_quo, id_quo);
}
rationalize(epsilon = nil) → rational 点击切换源代码

返回一个 Rational 对象,其值与 self.real 的值完全或近似相等。

如果未提供参数 epsilon,则返回一个 Rational 对象,其值与 self.real.rationalize 的值完全相同。

Complex(1, 0).rationalize              # => (1/1)
Complex(1, Rational(0, 1)).rationalize # => (1/1)
Complex(3.14159, 0).rationalize        # => (314159/100000)

如果提供了参数 epsilon,则返回一个 Rational 对象,其值与 self.real 的值完全相同或近似相同,精度为给定精度。

Complex(3.14159, 0).rationalize(0.1)          # => (16/5)
Complex(3.14159, 0).rationalize(0.01)         # => (22/7)
Complex(3.14159, 0).rationalize(0.001)        # => (201/64)
Complex(3.14159, 0).rationalize(0.0001)       # => (333/106)
Complex(3.14159, 0).rationalize(0.00001)      # => (355/113)
Complex(3.14159, 0).rationalize(0.000001)     # => (7433/2366)
Complex(3.14159, 0).rationalize(0.0000001)    # => (9208/2931)
Complex(3.14159, 0).rationalize(0.00000001)   # => (47460/15107)
Complex(3.14159, 0).rationalize(0.000000001)  # => (76149/24239)
Complex(3.14159, 0).rationalize(0.0000000001) # => (314159/100000)
Complex(3.14159, 0).rationalize(0.0)          # => (3537115888337719/1125899906842624)

相关:Complex#to_r.

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);
}
real → numeric 点击切换源代码

返回 self 的实数值。

Complex(7).real      #=> 7
Complex(9, -4).real  #=> 9

如果 self 是使用 极坐标 创建的,则返回的值是计算的,可能不精确

Complex.polar(1, Math::PI/4).real # => 0.7071067811865476 # Square root of 2.
VALUE
rb_complex_real(VALUE self)
{
    get_dat1(self);
    return dat->real;
}
real? → false 点击切换源代码

返回 false;为了与 Numeric#real? 兼容。

static VALUE
nucomp_real_p_m(VALUE self)
{
    return Qfalse;
}
rect → array

返回一个由参数组成的新的 Complex 对象,每个参数必须是 Numeric 的实例,或其子类的实例:Complex、FloatIntegerRational;请参阅 矩形坐标

Complex.rect(3)             # => (3+0i)
Complex.rect(3, Math::PI)   # => (3+3.141592653589793i)
Complex.rect(-3, -Math::PI) # => (-3-3.141592653589793i)

Complex.rectangular 是 Complex.rect 的别名。

别名:rectangular
rectangular -> array 点击切换源代码

返回数组 [self.real, self.imag]

Complex.rect(1, 2).rect # => [1, 2]

参见 直角坐标.

如果 self 是使用 极坐标 创建的,则返回的值是计算的,可能不精确

Complex.polar(1.0, 1.0).rect # => [0.5403023058681398, 0.8414709848078965]

Complex#rectangularComplex#rect 的别名。

static VALUE
nucomp_rect(VALUE self)
{
    get_dat1(self);
    return rb_assoc_new(dat->real, dat->imag);
}
也称为别名:rect,rect
to_c → self 点击切换源代码

返回 self

static VALUE
nucomp_to_c(VALUE self)
{
    return self;
}
to_f → float 点击切换源代码

如果可能,返回 self.real 的值作为 Float

Complex(1, 0).to_f              # => 1.0
Complex(1, Rational(0, 1)).to_f # => 1.0

如果 self.imag 不完全为零(既不是 Integer(0) 也不 Rational(0, n)),则引发 RangeError

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 点击切换源代码

如果可能,返回 self.real 的值作为 Integer

Complex(1, 0).to_i              # => 1
Complex(1, Rational(0, 1)).to_i # => 1

如果 self.imag 不完全为零(既不是 Integer(0) 也不 Rational(0, n)),则引发 RangeError

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 点击切换源代码

如果可能,返回 self.real 的值作为 Rational

Complex(1, 0).to_r              # => (1/1)
Complex(1, Rational(0, 1)).to_r # => (1/1)

如果 self.imag 不完全为零(既不是 Integer(0) 也不 Rational(0, n)),则引发 RangeError

相关:Complex#rationalize.

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 点击切换源代码

返回 self 的字符串表示形式

Complex(2).to_s                      # => "2+0i"
Complex('-8/6').to_s                 # => "-4/3+0i"
Complex('1/2i').to_s                 # => "0+1/2i"
Complex(0, Float::INFINITY).to_s     # => "0+Infinity*i"
Complex(Float::NAN, Float::NAN).to_s # => "NaN+NaN*i"
static VALUE
nucomp_to_s(VALUE self)
{
    return f_format(self, rb_String);
}