1/* tsgn -- Test for the sign of a floating point number.
2
3Copyright 2003, 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
28static void
29check_special (void)
30{
31  mpfr_t x;
32  int ret = 0;
33
34  mpfr_init (x);
35  MPFR_SET_ZERO (x);
36  if ((mpfr_sgn) (x) != 0 || mpfr_sgn (x) != 0)
37    {
38      printf("Sgn error for 0.\n");
39      ret = 1;
40    }
41  MPFR_SET_INF (x);
42  MPFR_SET_POS (x);
43  if ((mpfr_sgn) (x) != 1 || mpfr_sgn (x) != 1)
44    {
45      printf("Sgn error for +Inf.\n");
46      ret = 1;
47    }
48  MPFR_SET_INF (x);
49  MPFR_SET_NEG (x);
50  if ((mpfr_sgn) (x) != -1 || mpfr_sgn (x) != -1)
51    {
52      printf("Sgn error for -Inf.\n");
53      ret = 1;
54    }
55  MPFR_SET_NAN (x);
56  mpfr_clear_flags ();
57  if ((mpfr_sgn) (x) != 0 || !mpfr_erangeflag_p ())
58    {
59      printf("Sgn error for NaN.\n");
60      ret = 1;
61    }
62  mpfr_clear_flags ();
63  if (mpfr_sgn (x) != 0 || !mpfr_erangeflag_p ())
64    {
65      printf("Sgn error for NaN.\n");
66      ret = 1;
67    }
68  mpfr_clear (x);
69  if (ret)
70    exit (ret);
71}
72
73static void
74check_sgn(void)
75{
76  mpfr_t x;
77  int i, s1, s2;
78
79  mpfr_init(x);
80  for(i = 0 ; i < 100 ; i++)
81    {
82      mpfr_urandomb (x, RANDS);
83      if (i&1)
84        {
85          MPFR_SET_POS(x);
86          s2 = 1;
87        }
88      else
89        {
90          MPFR_SET_NEG(x);
91          s2 = -1;
92        }
93      s1 = mpfr_sgn(x);
94      if (s1 < -1 || s1 > 1)
95        {
96          printf("Error for sgn: out of range.\n");
97          goto lexit;
98        }
99      else if (MPFR_IS_NAN(x) || MPFR_IS_ZERO(x))
100        {
101          if (s1 != 0)
102            {
103              printf("Error for sgn: Nan or Zero should return 0.\n");
104              goto lexit;
105            }
106        }
107      else if (s1 != s2)
108        {
109          printf("Error for sgn. Return %d instead of %d.\n", s1, s2);
110          goto lexit;
111        }
112    }
113  mpfr_clear(x);
114  return;
115
116 lexit:
117  mpfr_clear(x);
118  exit(1);
119}
120
121int
122main (int argc, char *argv[])
123{
124  tests_start_mpfr ();
125
126  check_special ();
127  check_sgn ();
128
129  tests_end_mpfr ();
130  return 0;
131}
132