/* 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 <stdio.h>
#include <stdlib.h>
#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);
}
syntax highlighted by Code2HTML, v. 0.9.1