Annotation of OpenXM_contrib/gmp/mpf/set_prc.c, Revision 1.1.1.2
1.1 maekawa 1: /* mpf_set_prec(x) -- Change the precision of x.
2:
1.1.1.2 ! maekawa 3: Copyright (C) 1993, 1994, 1995, 2000 Free Software Foundation, Inc.
1.1 maekawa 4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
1.1.1.2 ! maekawa 8: it under the terms of the GNU Lesser General Public License as published by
! 9: the Free Software Foundation; either version 2.1 of the License, or (at your
1.1 maekawa 10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1.1.1.2 ! maekawa 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
1.1 maekawa 15: License for more details.
16:
1.1.1.2 ! maekawa 17: You should have received a copy of the GNU Lesser General Public License
1.1 maekawa 18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include "gmp.h"
23: #include "gmp-impl.h"
24:
25: void
26: #if __STDC__
27: mpf_set_prec (mpf_ptr x, unsigned long int prec_in_bits)
28: #else
29: mpf_set_prec (x, prec_in_bits)
30: mpf_ptr x;
31: unsigned long int prec_in_bits;
32: #endif
33: {
34: mp_size_t prec;
35: mp_size_t size = ABS (x->_mp_size);
36:
37: prec = (MAX (53, prec_in_bits) + 2 * BITS_PER_MP_LIMB - 1)/BITS_PER_MP_LIMB;
38:
39: /* We want the most significant limbs, so move the limbs down if we are
40: about to truncate the value. */
41: if (size > prec + 1)
42: {
43: mp_size_t offset = size - (prec + 1);
44: mp_ptr xp = x->_mp_d;
45:
1.1.1.2 ! maekawa 46: MPN_COPY_INCR (xp, xp + offset, prec + 1);
1.1 maekawa 47: }
48:
49: x->_mp_d = (mp_ptr) (*_mp_reallocate_func)
50: (x->_mp_d,
51: (x->_mp_prec + 1) * BYTES_PER_MP_LIMB, (prec + 1) * BYTES_PER_MP_LIMB);
52: x->_mp_prec = prec;
53:
54: /* If the precision decreased, truncate the number. */
55: if (size > prec + 1)
56: x->_mp_size = x->_mp_size >= 0 ? (prec + 1) : -(prec + 1);
57: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>