uceil_exp2.c revision 1.1.1.2
1/* __gmpfr_ceil_exp2 - returns y >= 2^d 2 3Copyright 1999-2004, 2006-2016 Free Software Foundation, Inc. 4Contributed by the AriC and Caramba 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 25/* returns y >= 2^d, assuming that d <= 1024 26 for d integer, returns exactly 2^d 27*/ 28double 29__gmpfr_ceil_exp2 (double d) 30{ 31 long exp; 32#if _GMP_IEEE_FLOATS 33 union ieee_double_extract x; 34#else 35 struct {double d;} x; 36#endif 37 38 MPFR_ASSERTN(d <= 1024.0); 39 exp = (long) d; 40 if (d != (double) exp) 41 exp++; 42 /* now exp = ceil(d) */ 43 x.d = 1.0; 44#if _GMP_IEEE_FLOATS 45 x.s.exp = exp <= -1022 ? 1 : 1023 + exp; 46#else 47 if (exp >= 0) 48 { 49 while (exp != 0) 50 { 51 x.d *= 2.0; 52 exp--; 53 } 54 } 55 else 56 { 57 while (exp != 0) 58 { 59 x.d *= (1.0 / 2.0); 60 exp++; 61 } 62 } 63#endif 64 return x.d; 65} 66