gsl_complex gsl_complex_pow_real (gsl_complex a, double b) { /* z=a^b */ gsl_complex z; if (GSL_REAL (a) == 0 && GSL_IMAG (a) == 0) { if (b == 0) { GSL_SET_COMPLEX (&z, 1, 0); } else { GSL_SET_COMPLEX (&z, 0, 0); } } else { double logr = gsl_complex_logabs (a); double theta = gsl_complex_arg (a); double rho = exp (logr * b); double beta = theta * b; GSL_SET_COMPLEX (&z, rho * cos (beta), rho * sin (beta)); } return z; }
/* ------------------------------------------------------ */ gsl_complex gsl_complex_clogabs (gsl_complex a) { gsl_complex z; GSL_SET_COMPLEX (&z, gsl_complex_logabs(a), 0); return z; }
gsl_complex gsl_complex_log(gsl_complex a) { /* z=log(a) */ double logr = gsl_complex_logabs(a); double theta = gsl_complex_arg(a); gsl_complex z; GSL_SET_COMPLEX(&z, logr, theta); return z; }
gsl_complex gsl_complex_pow(gsl_complex a, gsl_complex b) { /* z=a^b */ gsl_complex z; if (GSL_REAL(a) == 0 && GSL_IMAG(a) == 0.0) { GSL_SET_COMPLEX(&z, 0.0, 0.0); } else { double logr = gsl_complex_logabs(a); double theta = gsl_complex_arg(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); double rho = exp(logr * br - bi * theta); double beta = theta * br + bi * logr; GSL_SET_COMPLEX(&z, rho * cos(beta), rho * sin(beta)); } return z; }
double complex::log_of_abs() const { return gsl_complex_logabs(_complex); }
/* properties of complex numbers */ CAMLprim value ml_gsl_complex_logabs(value Z) { _DECLARE_COMPLEX(Z); _CONVERT_COMPLEX(Z); return copy_double(gsl_complex_logabs(z_Z)); }