1/* mpfr_cmpabs -- compare the absolute values of two FP numbers 2 3Copyright 1999, 2001-2004, 2006-2023 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 20https://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/* Return a positive value if abs(b) > abs(c), 0 if abs(b) = abs(c), and 26 a negative value if abs(b) < abs(c). */ 27 28int 29mpfr_cmpabs (mpfr_srcptr b, mpfr_srcptr c) 30{ 31 mpfr_exp_t be, ce; 32 mp_size_t bn, cn; 33 mp_limb_t *bp, *cp; 34 35 if (MPFR_ARE_SINGULAR (b, c)) 36 { 37 if (MPFR_IS_NAN (b) || MPFR_IS_NAN (c)) 38 { 39 MPFR_SET_ERANGEFLAG (); 40 return 0; 41 } 42 else if (MPFR_IS_INF (b)) 43 return ! MPFR_IS_INF (c); 44 else if (MPFR_IS_INF (c)) 45 return -1; 46 else if (MPFR_IS_ZERO (c)) 47 return ! MPFR_IS_ZERO (b); 48 else /* b == 0 */ 49 return -1; 50 } 51 52 MPFR_ASSERTD (MPFR_IS_PURE_FP (b)); 53 MPFR_ASSERTD (MPFR_IS_PURE_FP (c)); 54 55 /* Now that we know that b and c are pure FP numbers (i.e. they have 56 a meaningful exponent), we use MPFR_EXP instead of MPFR_GET_EXP to 57 allow exponents outside the current exponent range. For instance, 58 this is useful for mpfr_pow, which compares values to __gmpfr_one. 59 This is for internal use only! For compatibility with other MPFR 60 versions, the user must still provide values that are representable 61 in the current exponent range. */ 62 be = MPFR_EXP (b); 63 ce = MPFR_EXP (c); 64 if (be > ce) 65 return 1; 66 if (be < ce) 67 return -1; 68 69 /* exponents are equal */ 70 71 bn = MPFR_LIMB_SIZE(b)-1; 72 cn = MPFR_LIMB_SIZE(c)-1; 73 74 bp = MPFR_MANT(b); 75 cp = MPFR_MANT(c); 76 77 for ( ; bn >= 0 && cn >= 0; bn--, cn--) 78 { 79 if (bp[bn] > cp[cn]) 80 return 1; 81 if (bp[bn] < cp[cn]) 82 return -1; 83 } 84 85 for ( ; bn >= 0; bn--) 86 if (bp[bn]) 87 return 1; 88 89 for ( ; cn >= 0; cn--) 90 if (cp[cn]) 91 return -1; 92 93 return 0; 94} 95