summaryrefslogtreecommitdiff
path: root/Build/source/libs/mpfr/mpfr-src/src/gmp_op.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/mpfr/mpfr-src/src/gmp_op.c')
-rw-r--r--Build/source/libs/mpfr/mpfr-src/src/gmp_op.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/Build/source/libs/mpfr/mpfr-src/src/gmp_op.c b/Build/source/libs/mpfr/mpfr-src/src/gmp_op.c
index 2677b7089cd..e76a8afb969 100644
--- a/Build/source/libs/mpfr/mpfr-src/src/gmp_op.c
+++ b/Build/source/libs/mpfr/mpfr-src/src/gmp_op.c
@@ -23,6 +23,11 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
#define MPFR_NEED_LONGLONG_H
#include "mpfr-impl.h"
+/* TODO: for functions with mpz_srcptr, check whether mpz_fits_slong_p
+ is really useful in all cases. For instance, concerning the addition,
+ one now has mpz_t -> long -> unsigned long -> mpfr_t then mpfr_add
+ instead of mpz_t -> mpfr_t then mpfr_add. */
+
/* Init and set a mpfr_t with enough precision to store a mpz.
This function should be called in the extended exponent range. */
static void
@@ -83,21 +88,26 @@ foo2 (mpfr_ptr x, mpz_srcptr y, mpfr_srcptr z, mpfr_rnd_t r,
int
mpfr_mul_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
{
- return foo (y, x, z, r, mpfr_mul);
+ if (mpz_fits_slong_p (z))
+ return mpfr_mul_si (y, x, mpz_get_si (z), r);
+ else
+ return foo (y, x, z, r, mpfr_mul);
}
int
mpfr_div_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
{
- return foo (y, x, z, r, mpfr_div);
+ if (mpz_fits_slong_p (z))
+ return mpfr_div_si (y, x, mpz_get_si (z), r);
+ else
+ return foo (y, x, z, r, mpfr_div);
}
int
mpfr_add_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
{
- /* Mpz 0 is unsigned */
- if (MPFR_UNLIKELY (mpz_sgn (z) == 0))
- return mpfr_set (y, x, r);
+ if (mpz_fits_slong_p (z))
+ return mpfr_add_si (y, x, mpz_get_si (z), r);
else
return foo (y, x, z, r, mpfr_add);
}
@@ -105,9 +115,8 @@ mpfr_add_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
int
mpfr_sub_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
{
- /* Mpz 0 is unsigned */
- if (MPFR_UNLIKELY (mpz_sgn (z) == 0))
- return mpfr_set (y, x, r);
+ if (mpz_fits_slong_p (z))
+ return mpfr_sub_si (y, x, mpz_get_si (z), r);
else
return foo (y, x, z, r, mpfr_sub);
}
@@ -115,9 +124,8 @@ mpfr_sub_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r)
int
mpfr_z_sub (mpfr_ptr y, mpz_srcptr x, mpfr_srcptr z, mpfr_rnd_t r)
{
- /* Mpz 0 is unsigned */
- if (MPFR_UNLIKELY (mpz_sgn (x) == 0))
- return mpfr_neg (y, z, r);
+ if (mpz_fits_slong_p (x))
+ return mpfr_si_sub (y, mpz_get_si (x), z, r);
else
return foo2 (y, x, z, r, mpfr_sub);
}
@@ -128,11 +136,14 @@ mpfr_cmp_z (mpfr_srcptr x, mpz_srcptr z)
mpfr_t t;
int res;
mpfr_prec_t p;
- unsigned int flags;
+ mpfr_flags_t flags;
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
return mpfr_cmp_si (x, mpz_sgn (z));
+ if (mpz_fits_slong_p (z))
+ return mpfr_cmp_si (x, mpz_get_si (z));
+
if (mpz_size (z) <= 1)
p = GMP_NUMB_BITS;
else
@@ -153,6 +164,7 @@ mpfr_cmp_z (mpfr_srcptr x, mpz_srcptr z)
return res;
}
+#ifndef MPFR_USE_MINI_GMP
/* Compute y = RND(x*n/d), where n and d are mpz integers.
An integer 0 is assumed to have a positive sign.
This function is used by mpfr_mul_q and mpfr_div_q.
@@ -220,7 +232,8 @@ mpfr_muldiv_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr n, mpz_srcptr d,
MPFR_ASSERTN (!MPFR_BLOCK_EXCEP));
MPFR_EXP (y) += ex;
/* Detect highly unlikely, not supported corner cases... */
- MPFR_ASSERTN (MPFR_EXP (y) >= __gmpfr_emin && MPFR_IS_PURE_FP (y));
+ MPFR_ASSERTN (MPFR_EXP (y) >= __gmpfr_emin);
+ MPFR_ASSERTN (! MPFR_IS_SINGULAR (y));
/* The potential overflow will be detected by mpfr_check_range. */
}
else
@@ -465,7 +478,9 @@ mpfr_cmp_q (mpfr_srcptr x, mpq_srcptr q)
MPFR_SAVE_EXPO_FREE (expo);
return res;
}
+#endif
+#ifndef MPFR_USE_MINI_GMP
int
mpfr_cmp_f (mpfr_srcptr x, mpf_srcptr z)
{
@@ -478,7 +493,7 @@ mpfr_cmp_f (mpfr_srcptr x, mpf_srcptr z)
MPFR_SAVE_EXPO_MARK (expo);
- mpfr_init2 (t, MPFR_PREC_MIN + ABS(SIZ(z)) * GMP_NUMB_BITS );
+ mpfr_init2 (t, MPFR_PREC_MIN + ABSIZ(z) * GMP_NUMB_BITS);
res = mpfr_set_f (t, z, MPFR_RNDN);
MPFR_ASSERTD (res == 0);
res = mpfr_cmp (x, t);
@@ -487,3 +502,4 @@ mpfr_cmp_f (mpfr_srcptr x, mpf_srcptr z)
MPFR_SAVE_EXPO_FREE (expo);
return res;
}
+#endif