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_str. |
/* 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. |
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 <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <string.h> |
|
#include <time.h> |
#include "gmp.h" |
#include "gmp.h" |
#include "mpfr.h" |
#include "mpfr.h" |
#include <time.h> |
#include "mpfr-impl.h" |
|
#include "mpfr-test.h" |
|
|
#if defined (hpux) |
|
#define srandom srand48 |
|
#define random mrand48 |
|
#endif |
|
|
|
int |
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 <string> */ |
if (argc>=2) /* tset_str <string> <prec> */ |
mpfr_init2(x, 53); |
{ |
mpfr_set_str_raw(x, argv[1]); |
prec = (argc>=3) ? atoi(argv[2]) : 53; |
printf("%1.20e\n", mpfr_get_d(x)); |
mpfr_init2 (x, prec); |
mpfr_clear(x); |
mpfr_set_str_raw (x, argv[1]); |
exit (0); |
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; } |
nc = (argc > 1) ? atoi(argv[1]) : 53; |
if (nc < 24) { nc = 24; } |
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++) |
for(k = 1; k <= bd; k++) |
{ *(str2++) = (random() & 1) + '0'; } |
*(str2++) = (LONG_RAND() & 1) + '0'; |
} |
} |
else { *(str2++) = '0'; } |
else |
|
*(str2++) = '0'; |
|
|
*(str2++) = '.'; |
*(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'; |
free(str); |
sprintf(str2, "%d", random() - (1 << 30)); |
|
|
|
/* printf("%s\n", str); */ |
mpfr_set_prec (x, 53); |
mpfr_init2(x, nc + 10); |
mpfr_set_str_raw (x, "+110101100.01010000101101000000100111001000101011101110E00"); |
mpfr_set_str_raw(x, str); |
|
/* mpfr_print_raw(x); printf("\n"); */ |
|
|
|
mpfr_set_prec(x, 53); |
mpfr_set_str_raw (x, "1.0"); |
mpfr_set_str_raw(x, "+110101100.01010000101101000000100111001000101011101110E00"); |
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"); |
mpfr_set_str_raw (x, "+0000"); |
if (mpfr_get_d(x) != 1.0) { |
mpfr_set_str_raw (x, "+0000E0"); |
fprintf(stderr, "Error in mpfr_set_str_raw for s=1.0\n"); exit(1); |
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); |
mpfr_set_str (x, "+243495834958.53452345E1", 10, GMP_RNDN); |
exit (0); |
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; |
} |
} |