1/* mpfr_init2 -- initialize a floating-point number with given precision 2 3Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 4Contributed by the AriC and Caramel projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include "mpfr-impl.h" 24 25void 26mpfr_init2 (mpfr_ptr x, mpfr_prec_t p) 27{ 28 mp_size_t xsize; 29 mpfr_limb_ptr tmp; 30 31 /* Check if we can represent the number of limbs 32 * associated to the maximum of mpfr_prec_t*/ 33 MPFR_ASSERTN( MP_SIZE_T_MAX >= (MPFR_PREC_MAX/BYTES_PER_MP_LIMB) ); 34 35 /* Check for correct GMP_NUMB_BITS and BYTES_PER_MP_LIMB */ 36 MPFR_ASSERTN( GMP_NUMB_BITS == BYTES_PER_MP_LIMB * CHAR_BIT 37 && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ); 38 39 MPFR_ASSERTN (mp_bits_per_limb == GMP_NUMB_BITS); 40 41 /* Check for correct EXP NAN, ZERO & INF in both mpfr.h and mpfr-impl.h */ 42 MPFR_ASSERTN( __MPFR_EXP_NAN == MPFR_EXP_NAN ); 43 MPFR_ASSERTN( __MPFR_EXP_ZERO == MPFR_EXP_ZERO ); 44 MPFR_ASSERTN( __MPFR_EXP_INF == MPFR_EXP_INF ); 45 46 MPFR_ASSERTN( MPFR_EMAX_MAX <= (MPFR_EXP_MAX >> 1) ); 47 MPFR_ASSERTN( MPFR_EMIN_MIN >= -(MPFR_EXP_MAX >> 1) ); 48 49 /* p=1 is not allowed since the rounding to nearest even rule requires at 50 least two bits of mantissa: the neighbours of 3/2 are 1*2^0 and 1*2^1, 51 which both have an odd mantissa */ 52 MPFR_ASSERTN(p >= MPFR_PREC_MIN && p <= MPFR_PREC_MAX); 53 54 xsize = MPFR_PREC2LIMBS (p); 55 tmp = (mpfr_limb_ptr) (*__gmp_allocate_func)(MPFR_MALLOC_SIZE(xsize)); 56 57 MPFR_PREC(x) = p; /* Set prec */ 58 MPFR_EXP (x) = MPFR_EXP_INVALID; /* make sure that the exp field has a 59 valid value in the C point of view */ 60 MPFR_SET_POS(x); /* Set a sign */ 61 MPFR_SET_MANT_PTR(x, tmp); /* Set Mantissa ptr */ 62 MPFR_SET_ALLOC_SIZE(x, xsize); /* Fix alloc size of Mantissa */ 63 MPFR_SET_NAN(x); /* initializes to NaN */ 64} 65 66#ifdef MPFR_USE_OWN_MPFR_TMP_ALLOC 67static unsigned char mpfr_stack_tab[8000000]; 68unsigned char *mpfr_stack = mpfr_stack_tab; 69#endif 70