1/* Test mpq_cmp. 2 3Copyright 1996, 2001 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20#include <stdio.h> 21#include <stdlib.h> 22 23#include "gmp.h" 24#include "gmp-impl.h" 25#include "tests.h" 26 27#define NUM(x) (&((x)->_mp_num)) 28#define DEN(x) (&((x)->_mp_den)) 29 30#define SGN(x) ((x) < 0 ? -1 : (x) > 0 ? 1 : 0) 31 32int 33ref_mpq_cmp (mpq_t a, mpq_t b) 34{ 35 mpz_t ai, bi; 36 int cc; 37 38 mpz_init (ai); 39 mpz_init (bi); 40 41 mpz_mul (ai, NUM (a), DEN (b)); 42 mpz_mul (bi, NUM (b), DEN (a)); 43 cc = mpz_cmp (ai, bi); 44 mpz_clear (ai); 45 mpz_clear (bi); 46 return cc; 47} 48 49#ifndef SIZE 50#define SIZE 8 /* increasing this lowers the probabilty of finding an error */ 51#endif 52 53int 54main (int argc, char **argv) 55{ 56 mpq_t a, b; 57 mp_size_t size; 58 int reps = 10000; 59 int i; 60 int cc, ccref; 61 62 tests_start (); 63 64 if (argc == 2) 65 reps = atoi (argv[1]); 66 67 mpq_init (a); 68 mpq_init (b); 69 70 for (i = 0; i < reps; i++) 71 { 72 size = urandom () % SIZE - SIZE/2; 73 mpz_random2 (NUM (a), size); 74 do 75 { 76 size = urandom () % SIZE - SIZE/2; 77 mpz_random2 (DEN (a), size); 78 } 79 while (mpz_cmp_ui (DEN (a), 0) == 0); 80 81 size = urandom () % SIZE - SIZE/2; 82 mpz_random2 (NUM (b), size); 83 do 84 { 85 size = urandom () % SIZE - SIZE/2; 86 mpz_random2 (DEN (b), size); 87 } 88 while (mpz_cmp_ui (DEN (b), 0) == 0); 89 90 mpq_canonicalize (a); 91 mpq_canonicalize (b); 92 93 ccref = ref_mpq_cmp (a, b); 94 cc = mpq_cmp (a, b); 95 96 if (SGN (ccref) != SGN (cc)) 97 abort (); 98 } 99 100 mpq_clear (a); 101 mpq_clear (b); 102 103 tests_end (); 104 exit (0); 105} 106