1/* mpfr_cmp_ui_2exp -- compare a floating-point number with an unsigned 2machine integer multiplied by a power of 2 3 4Copyright 1999, 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 5Contributed by the AriC and Caramel projects, INRIA. 6 7This file is part of the GNU MPFR Library. 8 9The GNU MPFR Library is free software; you can redistribute it and/or modify 10it under the terms of the GNU Lesser General Public License as published by 11the Free Software Foundation; either version 3 of the License, or (at your 12option) any later version. 13 14The GNU MPFR Library is distributed in the hope that it will be useful, but 15WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17License for more details. 18 19You should have received a copy of the GNU Lesser General Public License 20along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 21http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2251 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24#define MPFR_NEED_LONGLONG_H 25#include "mpfr-impl.h" 26 27/* returns a positive value if b > i*2^f, 28 a negative value if b < i*2^f, 29 zero if b = i*2^f. 30 b must not be NaN 31*/ 32 33int 34mpfr_cmp_ui_2exp (mpfr_srcptr b, unsigned long int i, mpfr_exp_t f) 35{ 36 if (MPFR_UNLIKELY( MPFR_IS_SINGULAR(b) )) 37 { 38 if (MPFR_IS_NAN (b)) 39 { 40 MPFR_SET_ERANGE (); 41 return 0; 42 } 43 else if (MPFR_IS_INF(b)) 44 return MPFR_INT_SIGN (b); 45 else /* since b cannot be NaN, b=0 here */ 46 return i != 0 ? -1 : 0; 47 } 48 49 if (MPFR_IS_NEG (b)) 50 return -1; 51 /* now b > 0 */ 52 else if (MPFR_UNLIKELY(i == 0)) 53 return 1; 54 else /* b > 0, i > 0 */ 55 { 56 mpfr_exp_t e; 57 int k; 58 mp_size_t bn; 59 mp_limb_t c, *bp; 60 61 /* i must be representable in a mp_limb_t */ 62 MPFR_ASSERTN(i == (mp_limb_t) i); 63 64 e = MPFR_GET_EXP (b); /* 2^(e-1) <= b < 2^e */ 65 if (e <= f) 66 return -1; 67 if (f < MPFR_EMAX_MAX - GMP_NUMB_BITS && 68 e > f + GMP_NUMB_BITS) 69 return 1; 70 71 /* now f < e <= f + GMP_NUMB_BITS */ 72 c = (mp_limb_t) i; 73 count_leading_zeros(k, c); 74 if ((int) (e - f) > GMP_NUMB_BITS - k) 75 return 1; 76 if ((int) (e - f) < GMP_NUMB_BITS - k) 77 return -1; 78 79 /* now b and i*2^f have the same exponent */ 80 c <<= k; 81 bn = (MPFR_PREC(b) - 1) / GMP_NUMB_BITS; 82 bp = MPFR_MANT(b); 83 if (bp[bn] > c) 84 return 1; 85 if (bp[bn] < c) 86 return -1; 87 88 /* most significant limbs agree, check remaining limbs from b */ 89 while (bn > 0) 90 if (bp[--bn] != 0) 91 return 1; 92 return 0; 93 } 94} 95 96#undef mpfr_cmp_ui 97int 98mpfr_cmp_ui (mpfr_srcptr b, unsigned long int i) 99{ 100 return mpfr_cmp_ui_2exp (b, i, 0); 101} 102