X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=gmp%2Ftests%2Fmpf%2Ft-get_d.c;fp=gmp%2Ftests%2Fmpf%2Ft-get_d.c;h=644657b6093fa6f1b7c654caef09cd17b292aa9e;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/gmp/tests/mpf/t-get_d.c b/gmp/tests/mpf/t-get_d.c new file mode 100644 index 00000000..644657b6 --- /dev/null +++ b/gmp/tests/mpf/t-get_d.c @@ -0,0 +1,74 @@ +/* Test mpf_get_d and mpf_set_d. + + Copyright 1996, 1999, 2000, 2001 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 3 of the License, or (at your + option) any later version. + + The GNU MP 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 GNU MP Library. If not, see http://www.gnu.org/licenses/. */ + +#include +#include +#include "gmp.h" +#include "tests.h" + +#if defined (__vax__) +#define LOW_BOUND 1e-38 +#define HIGH_BOUND 8e37 +#endif + +#if defined (_CRAY) && ! defined (_CRAYIEEE) +/* The range varies mysteriously between Cray version. On an SV1, + the range seem to be 1e-600..1e603, but a cfp (non-ieee) T90 + has a much smaller range of 1e-240..1e240. */ +#define LOW_BOUND 1e-240 +#define HIGH_BOUND 1e240 +#endif + +#if ! defined (LOW_BOUND) +#define LOW_BOUND 1e-300 +#define HIGH_BOUND 1e300 +#endif + +int +main (int argc, char **argv) +{ + double d, e, r; + mpf_t u, v; + + tests_start (); + mpf_init (u); + mpf_init (v); + + mpf_set_d (u, LOW_BOUND); + for (d = 2.0 * LOW_BOUND; d < HIGH_BOUND; d *= 1.01) + { + mpf_set_d (v, d); + if (mpf_cmp (u, v) >= 0) + abort (); + e = mpf_get_d (v); + r = e/d; + if (r < 0.99999999999999 || r > 1.00000000000001) + { + fprintf (stderr, "should be one ulp from 1: %.16f\n", r); + abort (); + } + mpf_set (u, v); + } + + mpf_clear (u); + mpf_clear (v); + + tests_end (); + exit (0); +}