1/* Test mpz_set_f.
2
3Copyright 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#include "gmp.h"
23#include "gmp-impl.h"
24#include "tests.h"
25
26
27void
28check_one (mpz_srcptr z)
29{
30  static const int shift[] = {
31    0, 1, GMP_LIMB_BITS, 2*GMP_LIMB_BITS, 5*GMP_LIMB_BITS
32  };
33
34  int    sh, shneg, neg;
35  mpf_t  f;
36  mpz_t  got, want;
37
38  mpf_init2 (f, mpz_sizeinbase(z,2));
39  mpz_init (got);
40  mpz_init (want);
41
42  for (sh = 0; sh < numberof(shift); sh++)
43    {
44      for (shneg = 0; shneg <= 1; shneg++)
45	{
46	  for (neg = 0; neg <= 1; neg++)
47	    {
48	      mpf_set_z (f, z);
49	      mpz_set (want, z);
50
51	      if (neg)
52		{
53		  mpf_neg (f, f);
54		  mpz_neg (want, want);
55		}
56
57	      if (shneg)
58		{
59		  mpz_tdiv_q_2exp (want, want, shift[sh]);
60		  mpf_div_2exp (f, f, shift[sh]);
61		}
62	      else
63		{
64		  mpz_mul_2exp (want, want, shift[sh]);
65		  mpf_mul_2exp (f, f, shift[sh]);
66		}
67
68	      mpz_set_f (got, f);
69	      MPZ_CHECK_FORMAT (got);
70
71	      if (mpz_cmp (got, want) != 0)
72		{
73		  printf ("wrong result\n");
74		  printf ("  shift  %d\n", shneg ? -shift[sh] : shift[sh]);
75		  printf ("  neg    %d\n", neg);
76		  mpf_trace ("     f", f);
77		  mpz_trace ("   got", got);
78		  mpz_trace ("  want", want);
79		  abort ();
80		}
81	    }
82	}
83    }
84
85  mpf_clear (f);
86  mpz_clear (got);
87  mpz_clear (want);
88}
89
90
91void
92check_various (void)
93{
94  mpz_t  z;
95
96  mpz_init (z);
97
98  mpz_set_ui (z, 0L);
99  check_one (z);
100
101  mpz_set_si (z, 123L);
102  check_one (z);
103
104  mpz_rrandomb (z, RANDS, 2*GMP_LIMB_BITS);
105  check_one (z);
106
107  mpz_rrandomb (z, RANDS, 5*GMP_LIMB_BITS);
108  check_one (z);
109
110  mpz_clear (z);
111}
112
113
114int
115main (int argc, char *argv[])
116{
117#if GMP_NAIL_BITS == 0
118  tests_start ();
119  mp_trace_base = 16;
120
121  check_various ();
122
123  tests_end ();
124#endif
125  exit (0);
126}
127