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