1/* Test file for mpfr_greater_p, mpfr_greaterequal_p, mpfr_less_p,
2   mpfr_lessequal_p, mpfr_lessgreater_p, mpfr_equal_p, mpfr_unordered_p
3   functions.
4
5Copyright 2003, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
6Contributed by the Arenaire and Cacao projects, INRIA.
7
8This file is part of the GNU MPFR Library.
9
10The GNU MPFR Library is free software; you can redistribute it and/or modify
11it under the terms of the GNU Lesser General Public License as published by
12the Free Software Foundation; either version 3 of the License, or (at your
13option) any later version.
14
15The GNU MPFR Library is distributed in the hope that it will be useful, but
16WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
18License for more details.
19
20You should have received a copy of the GNU Lesser General Public License
21along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
22http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
2351 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
24
25#include <stdio.h>
26#include <stdlib.h>
27
28#include "mpfr-test.h"
29
30static void
31cmp_tests (void)
32{
33  mpfr_t x, y;
34  long i;
35
36  mpfr_inits (x, y, (mpfr_ptr) 0);
37  for (i = 0; i < 80000; i++)
38    {
39      mpfr_prec_t precx, precy;
40      int signx, signy, cmp;
41      unsigned int cmpbool = 0;
42
43      precx = (randlimb () % 17) * 11 + MPFR_PREC_MIN;
44      precy = (randlimb () % 17) * 11 + MPFR_PREC_MIN;
45      mpfr_set_prec (x, precx);
46      mpfr_set_prec (y, precy);
47      mpfr_urandomb (x, RANDS);
48      mpfr_urandomb (y, RANDS);
49      signx = randlimb () & 1;
50      signy = randlimb () % 256 ? signx : 1 - signx;
51      /* signy = signx most of the time (most interesting case) */
52      if (signx)
53        mpfr_neg (x, x, MPFR_RNDN);
54      if (signy)
55        mpfr_neg (y, y, MPFR_RNDN);
56      if (i <= 1)
57        mpfr_set_nan (x);
58      if (i == 0 || i == 2)
59        mpfr_set_nan (y);
60      if (mpfr_greater_p (x, y))
61        cmpbool |= 0x01;
62      if (mpfr_greaterequal_p (x, y))
63        cmpbool |= 0x02;
64      if (mpfr_less_p (x, y))
65        cmpbool |= 0x04;
66      if (mpfr_lessequal_p (x, y))
67        cmpbool |= 0x08;
68      if (mpfr_lessgreater_p (x, y))
69        cmpbool |= 0x10;
70      if (mpfr_equal_p (x, y))
71        cmpbool |= 0x20;
72      if (mpfr_unordered_p (x, y))
73        cmpbool |= 0x40;
74      if ((i <= 2 && cmpbool != 0x40) ||
75          (i > 2 && (cmp = mpfr_cmp (x, y),
76                     (cmp == 0 && cmpbool != 0x2a) ||
77                     (cmp < 0 && cmpbool != 0x1c) ||
78                     (cmp > 0 && cmpbool != 0x13))))
79        {
80          printf ("Error in cmp_tests for\nx = ");
81          mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
82          printf (" and\ny = ");
83          mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
84          printf ("\n");
85          exit (1);
86        }
87    }
88  mpfr_clears (x, y, (mpfr_ptr) 0);
89}
90
91static void
92eq_tests (void)
93{
94  mpfr_t x, y;
95  long i;
96
97  mpfr_inits (x, y, (mpfr_ptr) 0);
98  for (i = 0; i < 20000; i++)
99    {
100      mpfr_prec_t precx;
101
102      precx = (randlimb () % 17) * 11 + MPFR_PREC_MIN;
103      mpfr_set_prec (x, precx);
104      mpfr_set_prec (y, precx + (randlimb () % 64));
105      mpfr_urandomb (x, RANDS);
106      if (randlimb () & 1)
107        mpfr_neg (x, x, MPFR_RNDN);
108      mpfr_set (y, x, MPFR_RNDN);  /* exact -> x = y */
109      if (mpfr_greater_p (x, y) || !mpfr_greaterequal_p (x, y) ||
110          mpfr_less_p (x, y) || !mpfr_lessequal_p (x, y) ||
111          mpfr_lessgreater_p (x, y) || !mpfr_equal_p (x, y) ||
112          mpfr_unordered_p (x, y))
113        {
114          printf ("Error in eq_tests for x = ");
115          mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
116          printf ("\n");
117          exit (1);
118        }
119    }
120  mpfr_clears (x, y, (mpfr_ptr) 0);
121}
122
123int
124main (void)
125{
126  tests_start_mpfr ();
127  cmp_tests ();
128  eq_tests ();
129  tests_end_mpfr ();
130  return 0;
131}
132