-
-/* Compute the reciprocal of a complex number (guaranteed nonzero). */
-
-static void
-complex_reciprocal (gfc_expr * op)
-{
- mpfr_t mod, a, re, im;
-
- gfc_set_model (op->value.complex.r);
- mpfr_init (mod);
- mpfr_init (a);
- mpfr_init (re);
- mpfr_init (im);
-
- /* FIXME: another possible numerical problem. */
- mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
- mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
- mpfr_add (mod, mod, a, GFC_RND_MODE);
-
- mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
-
- mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
- mpfr_div (im, im, mod, GFC_RND_MODE);
-
- mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
- mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
-
- mpfr_clear (re);
- mpfr_clear (im);
- mpfr_clear (mod);
- mpfr_clear (a);
-}
-
-
-/* Raise a complex number to positive power. */
-
-static void
-complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
-{
- mpfr_t re, im, a;
-
- gfc_set_model (base->value.complex.r);
- mpfr_init (re);
- mpfr_init (im);
- mpfr_init (a);
-
- mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
- mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-
- for (; power > 0; power--)
- {
- mpfr_mul (re, base->value.complex.r, result->value.complex.r,
- GFC_RND_MODE);
- mpfr_mul (a, base->value.complex.i, result->value.complex.i,
- GFC_RND_MODE);
- mpfr_sub (re, re, a, GFC_RND_MODE);
-
- mpfr_mul (im, base->value.complex.r, result->value.complex.i,
- GFC_RND_MODE);
- mpfr_mul (a, base->value.complex.i, result->value.complex.r,
- GFC_RND_MODE);
- mpfr_add (im, im, a, GFC_RND_MODE);
-
- mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
- mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
- }
-
- mpfr_clear (re);
- mpfr_clear (im);
- mpfr_clear (a);
-}
-
-
-/* Raise a number to an integer power. */