version 1.1.1.1, 2000/09/09 14:12:19 |
version 1.1.1.2, 2003/08/25 16:06:10 |
|
|
/* Test file for mpfr_set_d and mpfr_get_d. |
/* Test file for mpfr_set_d and mpfr_get_d. |
|
|
Copyright (C) 1999 PolKA project, Inria Lorraine and Loria |
Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. |
|
|
This file is part of the MPFR Library. |
This file is part of the MPFR Library. |
|
|
The MPFR Library is free software; you can redistribute it and/or modify |
The MPFR Library is free software; you can redistribute it and/or modify |
it under the terms of the GNU Library General Public License as published by |
it under the terms of the GNU Lesser General Public License as published by |
the Free Software Foundation; either version 2 of the License, or (at your |
the Free Software Foundation; either version 2.1 of the License, or (at your |
option) any later version. |
option) any later version. |
|
|
The MPFR Library is distributed in the hope that it will be useful, but |
The MPFR Library is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
License for more details. |
License for more details. |
|
|
You should have received a copy of the GNU Library General Public License |
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 |
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, |
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, |
MA 02111-1307, USA. */ |
MA 02111-1307, USA. */ |
|
|
|
#include <float.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <time.h> |
#include <time.h> |
#ifdef IRIX64 |
|
#include <sys/fpu.h> |
|
#endif |
|
#include "gmp.h" |
#include "gmp.h" |
#include "mpfr.h" |
#include "mpfr.h" |
#include "mpfr-impl.h" |
#include "mpfr-test.h" |
|
|
extern int isnan(); |
|
|
|
int |
int |
main(int argc, char **argv) |
main (int argc, char *argv[]) |
{ |
{ |
fprintf(stderr, "Test case tset_d disabled\n"); |
mpfr_t x, y, z; |
exit(0); /* THIS TEST CASE IS NOT WORKING */ |
unsigned long k, n; |
|
double d, dd; |
|
|
|
mpfr_test_init (); |
|
|
#if 0 |
mpfr_init2 (x, 2); |
mpfr_t x,y,z; unsigned long k,n; double d, dd; |
|
#ifdef IRIX64 |
|
/* to get denormalized numbers on IRIX64 */ |
|
union fpc_csr exp; |
|
exp.fc_word = get_fpc_csr(); |
|
exp.fc_struct.flush = 0; |
|
set_fpc_csr(exp.fc_word); |
|
#endif |
|
|
|
|
/* checks that denormalized are not flushed to zero */ |
|
d = DBL_MIN; /* 2^(-1022) */ |
|
for (n=0; n<52; n++, d /= 2.0) |
|
if (d != 0.0) /* should be 2^(-1022-n) */ |
|
{ |
|
mpfr_set_d (x, d, GMP_RNDN); |
|
if (mpfr_cmp_ui_2exp (x, 1, -1022-n)) |
|
{ |
|
fprintf (stderr, "Wrong result for d=2^(%ld), ", -1022-n); |
|
fprintf (stderr, "got "); |
|
mpfr_out_str (stderr, 10, 10, x, GMP_RNDN); |
|
fprintf (stderr, "\n"); |
|
mpfr_print_binary (x); putchar ('\n'); |
|
exit (1); |
|
} |
|
} |
|
|
|
/* checks that rounds to nearest sets the last |
|
bit to zero in case of equal distance */ |
|
mpfr_set_d (x, 5.0, GMP_RNDN); |
|
if (mpfr_get_d1 (x) != 4.0) |
|
{ |
|
fprintf (stderr, "Error in tset_d: got %g instead of 4.0\n", |
|
mpfr_get_d1 (x)); |
|
exit (1); |
|
} |
|
mpfr_set_d (x, -5.0, GMP_RNDN); |
|
if (mpfr_get_d1 (x) != -4.0) |
|
{ |
|
fprintf (stderr, "Error in tset_d: got %g instead of -4.0\n", |
|
mpfr_get_d1 (x)); |
|
exit (1); |
|
} |
|
|
|
mpfr_set_d (x, 9.84891017624509146344e-01, GMP_RNDU); |
|
if (mpfr_get_d1 (x) != 1.0) |
|
{ |
|
fprintf (stderr, "Error in tset_d: got %g instead of 1.0\n", |
|
mpfr_get_d1 (x)); |
|
exit (1); |
|
} |
|
|
mpfr_init2(z, 32); |
mpfr_init2(z, 32); |
mpfr_set_d(z, 1.0, 0); |
mpfr_set_d(z, 1.0, 0); |
if (mpfr_get_d(z) != 1.0) { |
if (mpfr_get_d1 (z) != 1.0) { |
mpfr_print_raw(z); putchar('\n'); |
mpfr_print_binary(z); putchar('\n'); |
printf("Error: 1.0 != 1.0\n"); exit(1); |
printf("Error: 1.0 != 1.0\n"); exit(1); |
} |
} |
mpfr_init2(x, 53); mpfr_init2(y, 53); |
mpfr_set_prec(x, 53); mpfr_init2(y, 53); |
mpfr_set_d(x, d=-1.08007920352320089721e+150, 0); |
mpfr_set_d(x, d=-1.08007920352320089721e+150, 0); |
if (mpfr_get_d(x) != d) { |
if (mpfr_get_d1 (x) != d) { |
mpfr_print_raw(x); putchar('\n'); |
mpfr_print_binary(x); putchar('\n'); |
printf("Error: get_d o set_d <> identity for d = %1.20e %1.20e\n",d, |
printf("Error: get_d o set_d <> identity for d = %1.20e %1.20e\n",d, |
mpfr_get_d(x)); exit(1); |
mpfr_get_d1 (x)); exit(1); |
} |
} |
srand48(time(NULL)); |
|
|
SEED_RAND (time(NULL)); |
mpfr_set_d(x, 8.06294740693074521573e-310, 0); |
mpfr_set_d(x, 8.06294740693074521573e-310, 0); |
d = -6.72658901114033715233e-165; |
d = -6.72658901114033715233e-165; |
mpfr_set_d(x, d, 0); |
mpfr_set_d(x, d, 0); |
if (d != mpfr_get_d(x)) { |
if (d != mpfr_get_d1 (x)) { |
mpfr_print_raw(x); putchar('\n'); |
mpfr_print_binary(x); putchar('\n'); |
printf("Error: get_d o set_d <> identity for d = %1.20e %1.20e\n",d, |
printf("Error: get_d o set_d <> identity for d = %1.20e %1.20e\n",d, |
mpfr_get_d(x)); exit(1); |
mpfr_get_d1 (x)); exit(1); |
} |
} |
n = (argc==1) ? 1000000 : atoi(argv[1]); |
n = (argc==1) ? 1000000 : atoi(argv[1]); |
for (k = 1; k <= n; k++) |
for (k = 1; k <= n; k++) |
{ |
{ |
d = drand(); |
do |
mpfr_set_d(x, d, 0); |
{ |
dd = mpfr_get_d(x); |
d = drand(); |
|
} |
|
#ifdef HAVE_DENORMS |
|
while (0); |
|
#else |
|
while (ABS(d) <= 2.2e-307); |
|
#endif |
|
mpfr_set_d (x, d, 0); |
|
dd = mpfr_get_d1 (x); |
if (d != dd && (!isnan(d) || !isnan(dd))) |
if (d != dd && (!isnan(d) || !isnan(dd))) |
{ |
{ |
fprintf(stderr, |
fprintf(stderr, |
"Mismatch on : %1.18g != %1.18g\n", d, mpfr_get_d(x)); |
"Mismatch on : %1.18g != %1.18g\n", d, mpfr_get_d1 (x)); |
mpfr_print_raw(x); putchar('\n'); |
mpfr_print_binary(x); putchar('\n'); |
} |
exit(1); |
|
} |
} |
} |
|
|
mpfr_clear(x); mpfr_clear(y); mpfr_clear(z); |
mpfr_clear(x); mpfr_clear(y); mpfr_clear(z); |
exit (0); |
|
#endif /* 0 */ |
|
} |
|
|
|
|
return 0; |
|
} |