xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tdiv_d.c (revision b45fa494daa2ba02187711d31a4144faf0993066)
1 /* Test file for mpfr_div_d
2 
3 Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by the Arenaire and Cacao projects, INRIA.
5 
6 This file is part of the GNU MPFR Library.
7 
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17 
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <float.h>
26 
27 #include "mpfr-test.h"
28 
29 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)
30 
31 static void
32 check_nans (void)
33 {
34   mpfr_t  x, y;
35   int inexact;
36 
37   mpfr_init2 (x, 123);
38   mpfr_init2 (y, 123);
39 
40   /* nan / 1.0 is nan */
41   mpfr_set_nan (x);
42   mpfr_clear_flags ();
43   inexact = mpfr_div_d (y, x, 1.0, MPFR_RNDN);
44   MPFR_ASSERTN (inexact == 0);
45   MPFR_ASSERTN ((__gmpfr_flags ^ MPFR_FLAGS_NAN) == 0);
46   MPFR_ASSERTN (mpfr_nan_p (y));
47 
48   /* +inf / 1.0 == +inf */
49   mpfr_set_inf (x, 1);
50   mpfr_clear_flags ();
51   inexact = mpfr_div_d (y, x, 1.0, MPFR_RNDN);
52   MPFR_ASSERTN (inexact == 0);
53   MPFR_ASSERTN (__gmpfr_flags == 0);
54   MPFR_ASSERTN (mpfr_inf_p (y));
55   MPFR_ASSERTN (MPFR_IS_POS (y));
56 
57   /* -inf / 1.0 == -inf */
58   mpfr_set_inf (x, -1);
59   mpfr_clear_flags ();
60   inexact = mpfr_div_d (y, x, 1.0, MPFR_RNDN);
61   MPFR_ASSERTN (inexact == 0);
62   MPFR_ASSERTN (__gmpfr_flags == 0);
63   MPFR_ASSERTN (mpfr_inf_p (y));
64   MPFR_ASSERTN (MPFR_IS_NEG (y));
65 
66   /* 0.0 / 0.0 is nan */
67   mpfr_set_d (x, 0.0, MPFR_RNDN);
68   mpfr_clear_flags ();
69   inexact = mpfr_div_d (y, x, 0.0, MPFR_RNDN);
70   MPFR_ASSERTN (inexact == 0);
71   MPFR_ASSERTN ((__gmpfr_flags ^ MPFR_FLAGS_NAN) == 0);
72   MPFR_ASSERTN (mpfr_nan_p (y));
73 
74   mpfr_clear (x);
75   mpfr_clear (y);
76 }
77 
78 #define TEST_FUNCTION mpfr_sub_d
79 #define DOUBLE_ARG2
80 #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), 1, RANDS)
81 #include "tgeneric.c"
82 
83 int
84 main (void)
85 {
86   mpfr_t x, y, z;
87   double d;
88   int inexact;
89 
90   tests_start_mpfr ();
91 
92   /* check with enough precision */
93   mpfr_init2 (x, IEEE_DBL_MANT_DIG);
94   mpfr_init2 (y, IEEE_DBL_MANT_DIG);
95   mpfr_init2 (z, IEEE_DBL_MANT_DIG);
96 
97   mpfr_set_str (y, "4096", 10, MPFR_RNDN);
98   d = 0.125;
99   mpfr_clear_flags ();
100   inexact = mpfr_div_d (x, y, d, MPFR_RNDN);
101   if (inexact != 0)
102     {
103       printf ("Inexact flag error in mpfr_div_d\n");
104       exit (1);
105     }
106   mpfr_set_str (z, "32768", 10, MPFR_RNDN);
107   if (mpfr_cmp (z, x))
108     {
109       printf ("Error in mpfr_div_d (");
110       mpfr_out_str (stdout, 10, 0, y, MPFR_RNDN);
111       printf (" + %.20g)\nexpected ", d);
112       mpfr_out_str (stdout, 10, 0, z, MPFR_RNDN);
113       printf ("\ngot     ");
114       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
115       printf ("\n");
116       exit (1);
117     }
118   mpfr_clears (x, y, z, (mpfr_ptr) 0);
119 
120   check_nans ();
121 
122   test_generic (2, 1000, 100);
123 
124   tests_end_mpfr ();
125   return 0;
126 }
127 
128 #else
129 
130 int
131 main (void)
132 {
133   printf ("Warning! Test disabled for this MPFR version.\n");
134   return 0;
135 }
136 
137 #endif
138