1 /* Generate table of tests in tst-strtod-round.c from
3 Copyright (C) 2012-2017 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 /* Compile this program as:
22 gcc -std=gnu11 -O2 -Wall -Wextra gen-tst-strtod-round.c -lmpfr \
23 -o gen-tst-strtod-round
25 (use of current MPFR version recommended) and run it as:
27 gen-tst-strtod-round tst-strtod-round-data tst-strtod-round-data.h
29 The output file will be generated as tst-strtod-round-data.h
41 /* Work around incorrect ternary value from mpfr_strtofr
42 <https://sympa.inria.fr/sympa/arc/mpfr/2012-08/msg00005.html>. */
46 string_to_fp (mpfr_t f
, const char *s
, mpfr_rnd_t rnd
)
50 mpfr_init2 (f2
, 100000);
51 int r0
= mpfr_strtofr (f2
, s
, NULL
, 0, rnd
);
52 int r
= mpfr_set (f
, f2
, rnd
);
53 r
|= mpfr_subnormalize (f
, r
, rnd
);
57 int r
= mpfr_strtofr (f
, s
, NULL
, 0, rnd
);
58 r
|= mpfr_subnormalize (f
, r
, rnd
);
64 print_fp (FILE *fout
, mpfr_t f
, const char *suffix
)
67 mpfr_fprintf (fout
, "\t%sINF%s", mpfr_signbit (f
) ? "-" : "", suffix
);
69 mpfr_fprintf (fout
, "\t%Ra%s", f
, suffix
);
73 round_str (FILE *fout
, const char *s
, int prec
, int emin
, int emax
,
77 mpfr_set_default_prec (prec
);
81 int r
= string_to_fp (f
, s
, MPFR_RNDD
);
84 assert (prec
== 106 && emin
== -1073 && emax
== 1024);
85 /* The maximum value in IBM long double has discontiguous
88 mpfr_init2 (max_value
, 107);
89 mpfr_set_str (max_value
, "0x1.fffffffffffff7ffffffffffffcp+1023", 0,
91 if (mpfr_cmpabs (f
, max_value
) > 0)
93 mpfr_clear (max_value
);
95 mpfr_fprintf (fout
, "\t%s,\n", r
? "false" : "true");
96 print_fp (fout
, f
, ",\n");
97 string_to_fp (f
, s
, MPFR_RNDN
);
98 print_fp (fout
, f
, ",\n");
99 string_to_fp (f
, s
, MPFR_RNDZ
);
100 print_fp (fout
, f
, ",\n");
101 string_to_fp (f
, s
, MPFR_RNDU
);
102 print_fp (fout
, f
, "");
107 round_for_all (FILE *fout
, const char *s
)
109 static const struct fmt
{
115 { 24, -148, 128, false },
116 { 53, -1073, 1024, false },
117 /* This is the Intel extended float format. */
118 { 64, -16444, 16384, false },
119 /* This is the Motorola extended float format. */
120 { 64, -16445, 16384, false },
121 { 106, -1073, 1024, true },
122 { 113, -16493, 16384, false },
124 mpfr_fprintf (fout
, " TEST (\"");
129 if ((p
- s
) % 60 == 59 && p
[1])
130 mpfr_fprintf (fout
, "\"\n\t\"");
132 mpfr_fprintf (fout
, "\",\n");
134 int n_formats
= sizeof (formats
) / sizeof (formats
[0]);
135 for (i
= 0; i
< n_formats
; i
++)
137 round_str (fout
, s
, formats
[i
].prec
, formats
[i
].emin
,
138 formats
[i
].emax
, formats
[i
].ibm_ld
);
139 if (i
< n_formats
- 1)
140 mpfr_fprintf (fout
, ",\n");
142 mpfr_fprintf (fout
, "),\n");
146 main (int argc
, char **argv
)
152 char *fin_name
, *fout_name
;
156 fprintf (stderr
, "Usage: %s <input> <output>\n", basename (argv
[0]));
163 fin
= fopen (fin_name
, "r");
166 perror ("Could not open input for reading");
170 fout
= fopen (fout_name
, "w");
173 perror ("Could not open output for writing");
177 fprintf (fout
, "/* This file was generated by %s from %s. */\n",
179 fputs ("static const struct test tests[] = {\n", fout
);
180 while ((nbytes
= getline (&p
, &len
, fin
)) != -1)
182 if (p
[nbytes
- 1] == '\n')
184 round_for_all (fout
, p
);
188 fputs ("};\n", fout
);