summaryrefslogtreecommitdiff
path: root/mpfr/set_prec.c
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2003-12-20 00:22:58 +0100
committerKevin Ryde <user42@zip.com.au>2003-12-20 00:22:58 +0100
commit0f8902cf6361ac248827c174e5057cc028b56568 (patch)
treedd74e28772eb9c09dca7dc7c84b8c61db411cc3b /mpfr/set_prec.c
parent55ef89b3f254f921cb90b5eba0c154b929c4c4e9 (diff)
downloadgmp-0f8902cf6361ac248827c174e5057cc028b56568.tar.gz
* mpfr/*: Update to mpfr cvs head 2003-12-20.
Diffstat (limited to 'mpfr/set_prec.c')
-rw-r--r--mpfr/set_prec.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/mpfr/set_prec.c b/mpfr/set_prec.c
index 10e909e69..113da143b 100644
--- a/mpfr/set_prec.c
+++ b/mpfr/set_prec.c
@@ -26,22 +26,26 @@ MA 02111-1307, USA. */
#include "mpfr-impl.h"
void
-mpfr_set_prec (mpfr_ptr x, mp_prec_t p)
+mpfr_set_prec (mpfr_ptr x, mpfr_prec_t p)
{
- mp_size_t xsize;
+ mp_size_t xsize, xoldsize;
+ mp_ptr tmp;
+ /* first, check if p is correct */
MPFR_ASSERTN(p >= MPFR_PREC_MIN && p <= MPFR_PREC_MAX);
- xsize = (p - 1) / BITS_PER_MP_LIMB + 1; /* new limb size */
+ /* Calculate the new number of limbs */
+ xsize = (p - 1) / BITS_PER_MP_LIMB + 1;
- if (xsize > MPFR_ABSSIZE(x))
+ /* Realloc only if the new size is greater than the old */
+ xoldsize = MPFR_GET_ALLOC_SIZE(x);
+ if (xsize > xoldsize)
{
- MPFR_MANT(x) = (mp_ptr) (*__gmp_reallocate_func)
- (MPFR_MANT(x), (size_t) MPFR_ABSSIZE(x) * BYTES_PER_MP_LIMB,
- (size_t) xsize * BYTES_PER_MP_LIMB);
- MPFR_SIZE(x) = xsize; /* new number of allocated limbs */
+ tmp = (mp_ptr) (*__gmp_reallocate_func)
+ (MPFR_GET_REAL_PTR(x), MPFR_MALLOC_SIZE(xoldsize), MPFR_MALLOC_SIZE(xsize));
+ MPFR_SET_MANT_PTR(x, tmp);
+ MPFR_SET_ALLOC_SIZE(x, xsize);
}
-
MPFR_PREC(x) = p;
MPFR_SET_NAN(x); /* initializes to NaN */
}