1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
/* Test file for mpfr_set_z.
Copyright 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the MPFR Library.
The MPFR Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The MPFR Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the MPFR Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#include "mpfr-test.h"
static void check0(void)
{
mpz_t y;
mpfr_t x;
int inexact, r;
/* Check for +0 */
mpfr_init (x);
mpz_init (y);
mpz_set_si (y, 0);
for(r = 0; r < GMP_RND_MAX; r++)
{
inexact = mpfr_set_z (x, y, (mp_rnd_t) r);
if (!MPFR_IS_ZERO(x) || !MPFR_IS_POS(x) || inexact)
{
printf("mpfr_set_z(x,0) failed for %s\n",
mpfr_print_rnd_mode ((mp_rnd_t) r));
exit(1);
}
}
mpfr_clear(x);
mpz_clear(y);
}
/* FIXME: It'd be better to examine the actual data in an mpfr_t to see that
it's as expected. Comparing mpfr_set_z with mpfr_cmp or against
mpfr_get_si is a rather indirect test of a low level routine. */
static void
check (long i, mp_rnd_t rnd)
{
mpfr_t f;
mpz_t z;
mpfr_init2 (f, 8 * sizeof(long));
mpz_init (z);
mpz_set_ui (z, i);
mpfr_set_z (f, z, rnd);
if (mpfr_get_si (f, GMP_RNDZ) != i)
{
printf ("Error in mpfr_set_z for i=%ld rnd_mode=%d\n", i, rnd);
exit (1);
}
mpfr_clear (f);
mpz_clear (z);
}
static void
check_large (void)
{
mpz_t z;
mpfr_t x, y;
mp_exp_t emax, emin;
mpz_init (z);
mpfr_init2 (x, 160);
mpfr_init2 (y, 160);
mpz_set_str (z, "77031627725494291259359895954016675357279104942148788042", 10);
mpfr_set_z (x, z, GMP_RNDN);
mpfr_set_str_binary (y, "0.1100100100001111110110101010001000100001011010001100001000110100110001001100011001100010100010111000000011011100000111001101000100101001000000100100111000001001E186");
if (mpfr_cmp (x, y))
{
printf ("Error in mpfr_set_z on large input\n");
exit (1);
}
/* check overflow */
emax = mpfr_get_emax ();
set_emax (2);
mpz_set_str (z, "7", 10);
mpfr_set_z (x, z, GMP_RNDU);
MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
set_emax (3);
mpfr_set_prec (x, 2);
mpz_set_str (z, "7", 10);
mpfr_set_z (x, z, GMP_RNDU);
MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
set_emax (emax);
/* check underflow */
emin = mpfr_get_emin ();
set_emin (3);
mpz_set_str (z, "1", 10);
mpfr_set_z (x, z, GMP_RNDZ);
MPFR_ASSERTN(mpfr_cmp_ui (x, 0) == 0 && MPFR_IS_POS(x));
set_emin (2);
mpfr_set_z (x, z, GMP_RNDN);
MPFR_ASSERTN(mpfr_cmp_ui (x, 0) == 0 && MPFR_IS_POS(x));
set_emin (emin);
mpz_clear (z);
mpfr_clear (x);
mpfr_clear (y);
}
int
main (int argc, char *argv[])
{
long j;
tests_start_mpfr ();
check_large ();
check (0, (mp_rnd_t) 0);
for (j = 0; j < 200000; j++)
check (randlimb () & LONG_MAX, (mp_rnd_t) RND_RAND ());
check0 ();
tests_end_mpfr ();
return 0;
}
|