+2009-06-28 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gfortran.h: Define HAVE_mpc_pow.
+ * arith.c (complex_reciprocal, complex_pow): If HAVE_mpc_pow,
+ don't define these functions.
+ (arith_power): If HAVE_mpc_pow, use mpc_pow.
+
2009-06-26 Janus Weil <janus@gcc.gnu.org>
PR fortran/39997
/* Compute the reciprocal of a complex number (guaranteed nonzero). */
+#if ! defined(HAVE_mpc_pow)
static void
complex_reciprocal (gfc_expr *op)
{
}
#endif
}
+#endif /* ! HAVE_mpc_pow */
/* Raise a complex number to positive power (power > 0).
"Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
3rd Edition, 1998. */
+#if ! defined(HAVE_mpc_pow)
static void
complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
{
mpfr_clears (x_r, x_i, tmp, re, im, NULL);
}
+#endif /* ! HAVE_mpc_pow */
/* Raise a number to a power. */
case BT_COMPLEX:
{
+#ifdef HAVE_mpc_pow
+ mpc_t apower;
+ gfc_set_model (mpc_realref (op1->value.complex));
+ mpc_init2 (apower, mpfr_get_default_prec());
+ mpc_set_z (apower, op2->value.integer, GFC_MPC_RND_MODE);
+ mpc_pow(result->value.complex, op1->value.complex, apower,
+ GFC_MPC_RND_MODE);
+ mpc_clear (apower);
+#else
mpz_t apower;
/* Compute op1**abs(op2) */
/* If (op2 < 0), compute the inverse. */
if (power_sign < 0)
complex_reciprocal (result);
+#endif /* HAVE_mpc_pow */
}
break;
return ARITH_PROHIBIT;
}
+#ifdef HAVE_mpc_pow
+ mpc_pow (result->value.complex, op1->value.complex,
+ op2->value.complex, GFC_MPC_RND_MODE);
+#else
{
mpfr_t x, y, r, t;
mpfr_mul (mpc_imagref (result->value.complex), x, y, GFC_RND_MODE);
mpfr_clears (r, t, x, y, NULL);
}
+#endif /* HAVE_mpc_pow */
}
break;
default:
print *, nearest(1.0,-1.0)**(-huge(0)) ! { dg-error "Arithmetic overflow" }
!!!!!! COMPLEX BASE !!!!!!
- print *, (2.0,-4.3)**huge(0) ! { dg-error "Arithmetic NaN" }
- print *, (2.0,-4.3)**(-huge(0)) ! { dg-error "Arithmetic NaN" }
+! Put these lines back in (and "no-" -> "dg-") prior to gcc-4.5.
+! print *, (2.0,-4.3)**huge(0) ! { no-error "Arithmetic overflow" }
+! print *, (2.0,-4.3)**huge(0_8) ! { no-error "Arithmetic overflow" }
+! print *, (2.0,-4.3)**(-huge(0))
+! print *, (2.0,-4.3)**(-huge(0_8))
end program test