summaryrefslogtreecommitdiff
path: root/mpfr/tests/tset_str.c
diff options
context:
space:
mode:
Diffstat (limited to 'mpfr/tests/tset_str.c')
-rw-r--r--mpfr/tests/tset_str.c219
1 files changed, 122 insertions, 97 deletions
diff --git a/mpfr/tests/tset_str.c b/mpfr/tests/tset_str.c
index 5ea2b18d0..6824b8a43 100644
--- a/mpfr/tests/tset_str.c
+++ b/mpfr/tests/tset_str.c
@@ -1,20 +1,20 @@
/* Test file for mpfr_set_str.
-Copyright (C) 1999 Free Software Foundation.
+Copyright (C) 1999, 2001 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. */
@@ -28,117 +28,142 @@ MA 02111-1307, USA. */
#include <time.h>
int
-main(int argc, char **argv)
+main (int argc, char *argv[])
{
- mpfr_t x, y; unsigned long k, bd, nc, i; char *str, *str2; mp_exp_t e;
+ 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 <string> */
- mpfr_init2(x, 53);
- mpfr_set_str_raw(x, argv[1]);
- printf("%1.20e\n", mpfr_get_d(x));
- mpfr_clear(x);
- return 0;
- }
+ if (argc>=2) /* tset_str <string> <prec> */
+ {
+ 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));
+ srandom (time (NULL));
- if (argc > 1) { nc = atoi(argv[1]); } else { nc = 53; }
- if (nc < 100) { nc = 100; }
+ nc = (argc > 1) ? atoi(argv[1]) : 53;
+ if (nc < 100)
+ nc = 100;
- bd = random()&8;
+ bd = random() & 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++) = (random() & 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' + (random() & 1);
+
+ *(str2++) = 'e';
+ sprintf (str2, "%d", (int) random() - (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_raw(x);
+ putchar('\n');
+ mpfr_print_raw(y);
+ putchar('\n');
+ mpfr_clear(x);
+ mpfr_clear(y);
+ exit(1);
}
- *(str2++) = 'e';
- sprintf(str2, "%d", (int) random() - (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)) {
- fprintf(stderr, "Error in mpfr_set_str\n");
- mpfr_print_raw(x); putchar('\n');
- mpfr_print_raw(y); putchar('\n');
- mpfr_clear(x); mpfr_clear(y);
- exit(1);
- }
-
- free(str);
-
- mpfr_set_prec(x, 53);
- mpfr_set_str_raw(x, "+110101100.01010000101101000000100111001000101011101110E00");
-
- 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");
- mpfr_clear(x); mpfr_clear(y);
- exit(1);
- }
-
- mpfr_set_str_raw(x, "+0000");
- mpfr_set_str_raw(x, "+0000E0");
- mpfr_set_str_raw(x, "0000E0");
- if (mpfr_get_d(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_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);
+ free(str);
+
+ mpfr_set_prec (x, 53);
+ mpfr_set_str_raw (x, "+110101100.01010000101101000000100111001000101011101110E00");
+
+ 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");
+ mpfr_clear(x);
+ mpfr_clear(y);
+ exit(1);
+ }
+
+ mpfr_set_str_raw (x, "+0000");
+ mpfr_set_str_raw (x, "+0000E0");
+ mpfr_set_str_raw (x, "0000E0");
+ if (mpfr_get_d (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_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 = rand() % 4;
- logbase = (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_raw(x); putchar('\n');
- printf("s=%s, exp=%d, base=%d\n", str, (int) e, base);
- printf("y="); mpfr_print_raw(y); putchar('\n');
- mpfr_clear(x); mpfr_clear(y);
- exit(1);
+ mpfr_set_prec (x, prec);
+ mpfr_set_prec (y, prec);
+ for (i=0;i<100000;i++)
+ {
+ mpfr_random (x);
+ k = rand() % 4;
+ logbase = (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_raw (x);
+ putchar('\n');
+ printf ("s=%s, exp=%d, base=%d\n", str, (int) e, base);
+ printf ("y=");
+ mpfr_print_raw (y);
+ putchar('\n');
+ mpfr_clear (x);
+ mpfr_clear (y);
+ exit (1);
+ }
+ free (str);
}
- free(str);
- }
- mpfr_clear(x); mpfr_clear(y);
- return 0;
+ mpfr_clear (x);
+ mpfr_clear (y);
+
+ return 0;
}