1/* Test file for mpfr_cmp. 2 3Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4Contributed by the Arenaire and Cacao 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 <stdio.h> 24#include <stdlib.h> 25 26#include "mpfr-test.h" 27 28int 29main (void) 30{ 31 double x, y; 32 mpfr_t xx, yy; 33 int c; 34 long i; 35 mpfr_prec_t p; 36 37 tests_start_mpfr (); 38 39 mpfr_init (xx); 40 mpfr_init (yy); 41 42 mpfr_set_prec (xx, 2); 43 mpfr_set_prec (yy, 2); 44 mpfr_set_str_binary(xx, "-0.10E0"); 45 mpfr_set_str_binary(yy, "-0.10E0"); 46 if ((mpfr_cmp) (xx, yy)) 47 { 48 printf ("mpfr_cmp (xx, yy) returns non-zero for prec=2\n"); 49 exit (1); 50 } 51 52 mpfr_set_prec (xx, 65); 53 mpfr_set_prec (yy, 65); 54 mpfr_set_str_binary(xx, "0.10011010101000110101010000000011001001001110001011101011111011101E623"); 55 mpfr_set_str_binary(yy, "0.10011010101000110101010000000011001001001110001011101011111011100E623"); 56 p = 0; 57 if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 64) 58 { 59 printf ("Error (1) in mpfr_cmp2\n"); 60 exit (1); 61 } 62 mpfr_set_str_binary(xx, "0.10100010001110110111000010001000010011111101000100011101000011100"); 63 mpfr_set_str_binary(yy, "0.10100010001110110111000010001000010011111101000100011101000011011"); 64 p = 0; 65 if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 64) 66 { 67 printf ("Error (2) in mpfr_cmp2\n"); 68 exit (1); 69 } 70 71 mpfr_set_prec (xx, 160); mpfr_set_prec (yy, 160); 72 mpfr_set_str_binary (xx, "0.1E1"); 73 mpfr_set_str_binary (yy, "0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100"); 74 p = 0; 75 if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 144) 76 { 77 printf ("Error (3) in mpfr_cmp2\n"); 78 exit (1); 79 } 80 81 mpfr_set_prec (xx, 53); 82 mpfr_set_prec (yy, 200); 83 mpfr_set_ui (xx, 1, (mpfr_rnd_t) 0); 84 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0); 85 if (mpfr_cmp (xx, yy) != 0) 86 { 87 printf ("Error in mpfr_cmp: 1.0 != 1.0\n"); 88 exit (1); 89 } 90 mpfr_set_prec (yy, 31); 91 mpfr_set_str (xx, "1.0000000002", 10, (mpfr_rnd_t) 0); 92 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0); 93 if (!(mpfr_cmp (xx,yy)>0)) 94 { 95 printf ("Error in mpfr_cmp: not 1.0000000002 > 1.0\n"); 96 exit (1); 97 } 98 mpfr_set_prec (yy, 53); 99 100 /* bug found by Gerardo Ballabio */ 101 mpfr_set_ui(xx, 0, MPFR_RNDN); 102 mpfr_set_str (yy, "0.1", 10, MPFR_RNDN); 103 if ((c = mpfr_cmp (xx, yy)) >= 0) 104 { 105 printf ("Error in mpfr_cmp(0.0, 0.1), gives %d\n", c); 106 exit (1); 107 } 108 109 mpfr_set_inf (xx, 1); 110 mpfr_set_str (yy, "-23489745.0329", 10, MPFR_RNDN); 111 if ((c = mpfr_cmp (xx, yy)) <= 0) 112 { 113 printf ("Error in mpfr_cmp(Infp, 23489745.0329), gives %d\n", c); 114 exit (1); 115 } 116 117 mpfr_set_inf (xx, 1); 118 mpfr_set_inf (yy, -1); 119 if ((c = mpfr_cmp (xx, yy)) <= 0) 120 { 121 printf ("Error in mpfr_cmp(Infp, Infm), gives %d\n", c); 122 exit (1); 123 } 124 125 mpfr_set_inf (xx, -1); 126 mpfr_set_inf (yy, 1); 127 if ((c = mpfr_cmp (xx, yy)) >= 0) 128 { 129 printf ("Error in mpfr_cmp(Infm, Infp), gives %d\n", c); 130 exit (1); 131 } 132 133 mpfr_set_inf (xx, 1); 134 mpfr_set_inf (yy, 1); 135 if ((c = mpfr_cmp (xx, yy)) != 0) 136 { 137 printf ("Error in mpfr_cmp(Infp, Infp), gives %d\n", c); 138 exit (1); 139 } 140 141 mpfr_set_inf (xx, -1); 142 mpfr_set_inf (yy, -1); 143 if ((c = mpfr_cmp (xx, yy)) != 0) 144 { 145 printf ("Error in mpfr_cmp(Infm, Infm), gives %d\n", c); 146 exit (1); 147 } 148 149 mpfr_set_inf (xx, -1); 150 mpfr_set_str (yy, "2346.09234", 10, MPFR_RNDN); 151 if ((c = mpfr_cmp (xx, yy)) >= 0) 152 { 153 printf ("Error in mpfr_cmp(Infm, 2346.09234), gives %d\n", c); 154 exit (1); 155 } 156 157 mpfr_set_ui (xx, 0, MPFR_RNDN); 158 mpfr_set_ui (yy, 1, MPFR_RNDN); 159 if ((c = mpfr_cmp3 (xx, yy, 1)) >= 0) 160 { 161 printf ("Error: mpfr_cmp3 (0, 1, 1) gives %d instead of" 162 " a negative value\n", c); 163 exit (1); 164 } 165 if ((c = mpfr_cmp3 (xx, yy, -1)) <= 0) 166 { 167 printf ("Error: mpfr_cmp3 (0, 1, -1) gives %d instead of" 168 " a positive value\n", c); 169 exit (1); 170 } 171 172 for (i=0; i<500000; ) 173 { 174 x = DBL_RAND (); 175 y = DBL_RAND (); 176 if (!Isnan(x) && !Isnan(y)) 177 { 178 i++; 179 mpfr_set_d (xx, x, MPFR_RNDN); 180 mpfr_set_d (yy, y, MPFR_RNDN); 181 c = mpfr_cmp (xx,yy); 182 if ((c>0 && x<=y) || (c==0 && x!=y) || (c<0 && x>=y)) 183 { 184 printf ("Error in mpfr_cmp with x=%1.20e, y=%1.20e" 185 " mpfr_cmp(x,y)=%d\n", x, y, c); 186 exit (1); 187 } 188 } 189 } 190 191 /* Check for NAN */ 192 mpfr_set_nan (xx); 193 mpfr_clear_erangeflag (); 194 c = (mpfr_cmp) (xx, yy); 195 if (c != 0 || !mpfr_erangeflag_p () ) 196 { 197 printf ("NAN error (1)\n"); 198 exit (1); 199 } 200 mpfr_clear_erangeflag (); 201 c = (mpfr_cmp) (yy, xx); 202 if (c != 0 || !mpfr_erangeflag_p () ) 203 { 204 printf ("NAN error (2)\n"); 205 exit (1); 206 } 207 mpfr_clear_erangeflag (); 208 c = (mpfr_cmp) (xx, xx); 209 if (c != 0 || !mpfr_erangeflag_p () ) 210 { 211 printf ("NAN error (3)\n"); 212 exit (1); 213 } 214 215 mpfr_clear (xx); 216 mpfr_clear (yy); 217 218 tests_end_mpfr (); 219 return 0; 220} 221