=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpfr/tests/Attic/tset_str.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.2 diff -u -p -r1.1.1.1 -r1.1.1.2 --- OpenXM_contrib/gmp/mpfr/tests/Attic/tset_str.c 2000/09/09 14:12:19 1.1.1.1 +++ OpenXM_contrib/gmp/mpfr/tests/Attic/tset_str.c 2003/08/25 16:06:10 1.1.1.2 @@ -1,87 +1,197 @@ /* Test file for mpfr_set_str. -Copyright (C) 1999 PolKA project, Inria Lorraine and Loria +Copyright 1999, 2001, 2002 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 Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at your +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 Library General Public +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 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 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include +#include +#include #include "gmp.h" #include "mpfr.h" -#include +#include "mpfr-impl.h" +#include "mpfr-test.h" -#if defined (hpux) -#define srandom srand48 -#define random mrand48 -#endif - int -main(int argc, char **argv) +main (int argc, char *argv[]) { - mpfr_t x; unsigned long k, bd, nc; char *str, *str2; + mpfr_t x, y; + unsigned long k, bd, nc, i; + char *str, *str2; + mp_exp_t e; + int base, logbase, prec, baseprec; - if (argc==2) { /* tset_str */ - mpfr_init2(x, 53); - mpfr_set_str_raw(x, argv[1]); - printf("%1.20e\n", mpfr_get_d(x)); - mpfr_clear(x); - exit (0); - } + if (argc>=2) /* tset_str */ + { + prec = (argc>=3) ? atoi(argv[2]) : 53; + mpfr_init2 (x, prec); + mpfr_set_str_raw (x, argv[1]); + mpfr_out_str (stdout, 10, 0, x, GMP_RNDN); + putchar ('\n'); + mpfr_clear (x); + return 0; + } - srandom(time(NULL)); + SEED_RAND (time(NULL)); - if (argc > 1) { nc = atoi(argv[1]); } else { nc = 53; } - if (nc < 24) { nc = 24; } + nc = (argc > 1) ? atoi(argv[1]) : 53; + if (nc < 100) + nc = 100; - bd = random()&8; + bd = LONG_RAND() & 8; - str2 = str = (char *) malloc (nc*sizeof(char)); + str2 = str = (char *) malloc (nc * sizeof(char)); - if (bd) + if (bd) { - for(k = 1; k <= bd; k++) - { *(str2++) = (random() & 1) + '0'; } + for(k = 1; k <= bd; k++) + *(str2++) = (LONG_RAND() & 1) + '0'; } - else { *(str2++) = '0'; } + else + *(str2++) = '0'; *(str2++) = '.'; - for(k = 1; k < nc - 17 - bd; k++) + for (k = 1; k < nc - 17 - bd; k++) + *(str2++) = '0' + (LONG_RAND() & 1); + + *(str2++) = 'e'; + sprintf (str2, "%d", (int) LONG_RAND() - (1 << 30)); + + mpfr_init2 (x, nc + 10); + mpfr_set_str_raw (x, str); + + mpfr_set_prec (x, 54); + mpfr_set_str_raw (x, "0.100100100110110101001010010101111000001011100100101010E-529"); + mpfr_init2 (y, 54); + mpfr_set_str (y, "4.936a52bc17254@-133", 16, GMP_RNDN); + if (mpfr_cmp (x, y)) { - *(str2++) = '0' + (random() & 1); + fprintf (stderr, "Error in mpfr_set_str\n"); + mpfr_print_binary(x); + putchar('\n'); + mpfr_print_binary(y); + putchar('\n'); + mpfr_clear(x); + mpfr_clear(y); + exit(1); } - *(str2++) = 'e'; - sprintf(str2, "%d", random() - (1 << 30)); + free(str); - /* printf("%s\n", str); */ - mpfr_init2(x, nc + 10); - mpfr_set_str_raw(x, str); - /* mpfr_print_raw(x); printf("\n"); */ + mpfr_set_prec (x, 53); + mpfr_set_str_raw (x, "+110101100.01010000101101000000100111001000101011101110E00"); - mpfr_set_prec(x, 53); - mpfr_set_str_raw(x, "+110101100.01010000101101000000100111001000101011101110E00"); + mpfr_set_str_raw (x, "1.0"); + if (mpfr_get_d1 (x) != 1.0) + { + fprintf (stderr, "Error in mpfr_set_str_raw for s=1.0\n"); + mpfr_clear(x); + mpfr_clear(y); + exit(1); + } - mpfr_set_str_raw(x, "1.0"); - if (mpfr_get_d(x) != 1.0) { - fprintf(stderr, "Error in mpfr_set_str_raw for s=1.0\n"); exit(1); - } + mpfr_set_str_raw (x, "+0000"); + mpfr_set_str_raw (x, "+0000E0"); + mpfr_set_str_raw (x, "0000E0"); + if (mpfr_get_d1 (x) != 0.0) + { + fprintf (stderr, "Error in mpfr_set_str_raw for s=0.0\n"); + mpfr_clear (x); + mpfr_clear (y); + exit (1); + } - mpfr_clear(x); free(str); - exit (0); + mpfr_set_str (x, "+243495834958.53452345E1", 10, GMP_RNDN); + mpfr_set_str (x, "9007199254740993", 10, GMP_RNDN); + mpfr_set_str (x, "9007199254740992", 10, GMP_RNDU); + mpfr_set_str (x, "9007199254740992", 10, GMP_RNDD); + mpfr_set_str (x, "9007199254740992", 10, GMP_RNDZ); + + /* check a random number printed and read is not modified */ + prec = 53; + mpfr_set_prec (x, prec); + mpfr_set_prec (y, prec); + for (i=0;i<100000;i++) + { + mpfr_random (x); + k = LONG_RAND() % 4; + logbase = (LONG_RAND() % 5) + 1; + base = 1 << logbase; + /* Warning: the number of bits needed to print exactly a number of + 'prec' bits in base 2^logbase may be greater than ceil(prec/logbase), + for example 0.11E-1 in base 2 cannot be written exactly with only + one digit in base 4 */ + if (base == 2) + baseprec = prec; + else + baseprec = 1 + (prec - 2 + logbase) / logbase; + str = mpfr_get_str (NULL, &e, base, baseprec, x, k); + mpfr_set_str (y, str, base, k); + MPFR_EXP(y) += logbase * (e - strlen (str)); + if (mpfr_cmp (x, y)) + { + fprintf (stderr, "mpfr_set_str o mpfr_get_str <> id for rnd_mode=%s\n", + mpfr_print_rnd_mode (k)); + printf ("x="); + mpfr_print_binary (x); + putchar('\n'); + printf ("s=%s, exp=%d, base=%d\n", str, (int) e, base); + printf ("y="); + mpfr_print_binary (y); + putchar('\n'); + mpfr_clear (x); + mpfr_clear (y); + exit (1); + } + free (str); + } + + if (mpfr_set_str (x, "NaN", 10, GMP_RNDN) != 0 || !mpfr_nan_p(x)) + { + fprintf (stderr, "mpfr_set_str failed on NaN\n"); + exit (1); + } + + if (mpfr_set_str (x, "Inf", 10, GMP_RNDN) != 0 || !mpfr_inf_p(x) || + MPFR_SIGN(x) < 0) + { + fprintf (stderr, "mpfr_set_str failed on Inf\n"); + exit (1); + } + + if (mpfr_set_str (x, "-Inf", 10, GMP_RNDN) != 0 || !mpfr_inf_p(x) || + MPFR_SIGN(x) > 0) + { + fprintf (stderr, "mpfr_set_str failed on -Inf\n"); + exit (1); + } + + if (mpfr_set_str (x, "+Inf", 10, GMP_RNDN) != 0 || !mpfr_inf_p(x) || + MPFR_SIGN(x) < 0) + { + fprintf (stderr, "mpfr_set_str failed on +Inf\n"); + exit (1); + } + + mpfr_clear (x); + mpfr_clear (y); + + return 0; }