Blame tests/mpq/t-cmp_z.c

Packit 5c3484
/* Test mpq_cmp_z.
Packit 5c3484
Packit 5c3484
Copyright 1996, 2001, 2015 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library test suite.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is free software; you can redistribute it
Packit 5c3484
and/or modify it under the terms of the GNU General Public License as
Packit 5c3484
published by the Free Software Foundation; either version 3 of the License,
Packit 5c3484
or (at your option) any later version.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is distributed in the hope that it will be
Packit 5c3484
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5c3484
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 5c3484
Public License for more details.
Packit 5c3484
Packit 5c3484
You should have received a copy of the GNU General Public License along with
Packit 5c3484
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "gmp-impl.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
Packit 5c3484
#define SGN(x) ((x) < 0 ? -1 : (x) > 0 ? 1 : 0)
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
ref_mpq_cmp_z (mpq_t a, mpz_t b)
Packit 5c3484
{
Packit 5c3484
  mpz_t bi;
Packit 5c3484
  int cc;
Packit 5c3484
Packit 5c3484
  mpz_init (bi);
Packit 5c3484
Packit 5c3484
  mpz_mul (bi, b, DEN (a));
Packit 5c3484
  cc = mpz_cmp (NUM (a), bi);
Packit 5c3484
  mpz_clear (bi);
Packit 5c3484
  return cc;
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
#ifndef SIZE
Packit 5c3484
#define SIZE 8	/* increasing this lowers the probability of finding an error */
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#ifndef MAXN
Packit 5c3484
#define MAXN 5	/* increasing this impatcs on total timing */
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
sizes_test (int m)
Packit 5c3484
{
Packit 5c3484
  mpq_t a;
Packit 5c3484
  mpz_t b;
Packit 5c3484
  int i, j, k, s;
Packit 5c3484
  int cc, ccref;
Packit 5c3484
Packit 5c3484
  mpq_init (a);
Packit 5c3484
  mpz_init (b);
Packit 5c3484
Packit 5c3484
  for (i = 0; i <= MAXN ; ++i)
Packit 5c3484
    {
Packit 5c3484
      mpz_setbit (DEN (a), i*m); /* \sum_0^i 2^(i*m) */
Packit 5c3484
      for (j = 0; j <= MAXN; ++j)
Packit 5c3484
	{
Packit 5c3484
	  mpz_set_ui (NUM (a), 0);
Packit 5c3484
	  mpz_setbit (NUM (a), j*m); /* 2^(j*m) */
Packit 5c3484
	  for (k = 0; k <= MAXN; ++k)
Packit 5c3484
	    {
Packit 5c3484
	      mpz_set_ui (b, 0);
Packit 5c3484
	      mpz_setbit (b, k*m); /* 2^(k*m) */
Packit 5c3484
	      if (i == 0) /* Denominator is 1, compare the two exponents */
Packit 5c3484
		ccref = (j>k)-(j
Packit 5c3484
	      else
Packit 5c3484
		ccref = j-i > k ? 1 : -1;
Packit 5c3484
	      for (s = 1; s >= -1; s -= 2)
Packit 5c3484
		{
Packit 5c3484
		  cc = mpq_cmp_z (a, b);
Packit 5c3484
Packit 5c3484
		  if (ccref != SGN (cc))
Packit 5c3484
		    {
Packit 5c3484
		      fprintf (stderr, "i=%i, j=%i, k=%i, m=%i, s=%i\n; ccref= %i, cc= %i\n", i, j, k, m, s, ccref, cc);
Packit 5c3484
		      abort ();
Packit 5c3484
		    }
Packit 5c3484
Packit 5c3484
		  mpq_neg (a, a);
Packit 5c3484
		  mpz_neg (b, b);
Packit 5c3484
		  ccref = - ccref;
Packit 5c3484
		}
Packit 5c3484
	    }
Packit 5c3484
	}
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  mpq_clear (a);
Packit 5c3484
  mpz_clear (b);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char **argv)
Packit 5c3484
{
Packit 5c3484
  mpq_t a;
Packit 5c3484
  mpz_t b;
Packit 5c3484
  mp_size_t size;
Packit 5c3484
  int reps = 10000;
Packit 5c3484
  int i;
Packit 5c3484
  int cc, ccref;
Packit 5c3484
Packit 5c3484
  tests_start ();
Packit 5c3484
Packit 5c3484
  if (argc == 2)
Packit 5c3484
     reps = atoi (argv[1]);
Packit 5c3484
Packit 5c3484
  mpq_init (a);
Packit 5c3484
  mpz_init (b);
Packit 5c3484
Packit 5c3484
  for (i = 0; i < reps; i++)
Packit 5c3484
    {
Packit 5c3484
      if (i % 8192 == 0)
Packit 5c3484
	sizes_test (urandom () % (i + 1) + 1);	  
Packit 5c3484
      size = urandom () % SIZE - SIZE/2;
Packit 5c3484
      mpz_random2 (NUM (a), size);
Packit 5c3484
      do
Packit 5c3484
	{
Packit 5c3484
	  size = urandom () % (SIZE/2);
Packit 5c3484
	  mpz_random2 (DEN (a), size);
Packit 5c3484
	}
Packit 5c3484
      while (mpz_cmp_ui (DEN (a), 0) == 0);
Packit 5c3484
Packit 5c3484
      size = urandom () % SIZE - SIZE/2;
Packit 5c3484
      mpz_random2 (b, size);
Packit 5c3484
Packit 5c3484
      mpq_canonicalize (a);
Packit 5c3484
Packit 5c3484
      ccref = ref_mpq_cmp_z (a, b);
Packit 5c3484
      cc = mpq_cmp_z (a, b);
Packit 5c3484
Packit 5c3484
      if (SGN (ccref) != SGN (cc))
Packit 5c3484
	abort ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  mpq_clear (a);
Packit 5c3484
  mpz_clear (b);
Packit 5c3484
Packit 5c3484
  tests_end ();
Packit 5c3484
  exit (0);
Packit 5c3484
}