예제 #1
0
// Override.
// (r * exp(i * theta))^(a + bi) = r^(a + bi) * exp(i * theta * a - theta * b)
//    = (r^a * exp(-theta * b)) * (r^b * exp(theta * a))^i
ComplexNumber Power::eval(const ComplexNumber z) const {
    double r = z.mag(), theta = z.angle();
    double a = exponent.real(), b = exponent.imag();

    double coeff = pow(r, a) * exp(-theta * b);
    ComplexNumber w = iPower(pow(r, b) * exp(theta * a));

    ComplexNumber v (coeff * w.real(), coeff * w.imag());
    return v;
}
예제 #2
0
// Override.
// ln(z) = ln(|r|) + i * theta, where z = r * e^(i * theta)
// log_z(w) = ln(w) * log_z(e) = ln(w) * 1 / (ln(r) + i * theta), where z = r * e^(i * theta).
ComplexNumber Logarithm::eval(const ComplexNumber z) const {
    ComplexNumber argument = z + lambda;
    ComplexNumber ln_z (log(argument.mag()), argument.angle());

    if (base == exp(1)) {
        return coefficient * ln_z;
    } else {
        ComplexNumber one (1, 0);
        ComplexNumber log_base (log(base.mag()), base.angle());
        return coefficient * ln_z * (one / log_base);
    }
}