1/* mpfr_cmp -- compare two floating-point numbers 2 3Copyright 1999, 2001, 2003-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/* returns 0 iff b = sign(s) * c 26 a positive value iff b > sign(s) * c 27 a negative value iff b < sign(s) * c 28 returns 0 and sets erange flag if b and/or c is NaN. 29*/ 30 31MPFR_HOT_FUNCTION_ATTR int 32mpfr_cmp3 (mpfr_srcptr b, mpfr_srcptr c, int s) 33{ 34 mpfr_exp_t be, ce; 35 mp_size_t bn, cn; 36 mp_limb_t *bp, *cp; 37 38 s = MPFR_MULT_SIGN(s, MPFR_SIGN(c)); 39 40 if (MPFR_ARE_SINGULAR(b, c)) 41 { 42 if (MPFR_IS_NAN (b) || MPFR_IS_NAN (c)) 43 { 44 MPFR_SET_ERANGEFLAG (); 45 return 0; 46 } 47 else if (MPFR_IS_INF(b)) 48 { 49 if (MPFR_IS_INF(c) && s == MPFR_SIGN(b) ) 50 return 0; 51 else 52 return MPFR_SIGN(b); 53 } 54 else if (MPFR_IS_INF(c)) 55 return -s; 56 else if (MPFR_IS_ZERO(b)) 57 return MPFR_IS_ZERO(c) ? 0 : -s; 58 else /* necessarily c=0 */ 59 return MPFR_SIGN(b); 60 } 61 /* b and c are real numbers */ 62 if (s != MPFR_SIGN(b)) 63 return MPFR_SIGN(b); 64 65 /* now signs are equal */ 66 67 be = MPFR_GET_EXP (b); 68 ce = MPFR_GET_EXP (c); 69 if (be > ce) 70 return s; 71 if (be < ce) 72 return -s; 73 74 /* both signs and exponents are equal */ 75 76 bn = MPFR_LAST_LIMB (b); 77 cn = MPFR_LAST_LIMB (c); 78 79 bp = MPFR_MANT(b); 80 cp = MPFR_MANT(c); 81 82 for ( ; bn >= 0 && cn >= 0; bn--, cn--) 83 { 84 if (bp[bn] > cp[cn]) 85 return s; 86 if (bp[bn] < cp[cn]) 87 return -s; 88 } 89 for ( ; bn >= 0; bn--) 90 if (bp[bn]) 91 return s; 92 for ( ; cn >= 0; cn--) 93 if (cp[cn]) 94 return -s; 95 96 return 0; 97} 98 99#undef mpfr_cmp 100int 101mpfr_cmp (mpfr_srcptr b, mpfr_srcptr c) 102{ 103 return mpfr_cmp3 (b, c, 1); 104} 105