/* Generate table of tests in tst-strtod-round.c from tst-strtod-round-data. Copyright (C) 2012-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify 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 GNU C 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ #define _GNU_SOURCE #include #include #include #include #include /* Work around incorrect ternary value from mpfr_strtofr . */ #define WORKAROUND static int string_to_fp (mpfr_t f, const char *s, mpfr_rnd_t rnd) { #ifdef WORKAROUND mpfr_t f2; mpfr_init2 (f2, 100000); int r0 = mpfr_strtofr (f2, s, NULL, 0, rnd); int r = mpfr_set (f, f2, rnd); mpfr_subnormalize (f, r, rnd); mpfr_clear (f2); return r0 | r; #else int r = mpfr_strtofr (f, s, NULL, 0, rnd); mpfr_subnormalize (f, r, rnd); return r; #endif } static void print_fp (mpfr_t f, const char *suffix, const char *suffix2) { if (mpfr_inf_p (f)) mpfr_printf ("\t%sINFINITY%s", mpfr_signbit (f) ? "-" : "", suffix2); else mpfr_printf ("\t%Ra%s%s", f, suffix, suffix2); } static void round_str (const char *s, const char *suffix, int prec, int emin, int emax, bool ibm_ld) { mpfr_t f; mpfr_set_default_prec (prec); mpfr_set_emin (emin); mpfr_set_emax (emax); mpfr_init (f); int r = string_to_fp (f, s, MPFR_RNDD); if (ibm_ld) { assert (prec == 106 && emin == -1073 && emax == 1024); /* The maximum value in IBM long double has discontiguous mantissa bits. */ mpfr_t max_value; mpfr_init2 (max_value, 107); mpfr_set_str (max_value, "0x1.fffffffffffff7ffffffffffffcp+1023", 0, MPFR_RNDN); if (mpfr_cmpabs (f, max_value) > 0) r = 1; mpfr_clear (max_value); } mpfr_printf ("\t%s,\n", r ? "false" : "true"); print_fp (f, suffix, ",\n"); string_to_fp (f, s, MPFR_RNDN); print_fp (f, suffix, ",\n"); string_to_fp (f, s, MPFR_RNDZ); print_fp (f, suffix, ",\n"); string_to_fp (f, s, MPFR_RNDU); print_fp (f, suffix, ""); mpfr_clear (f); } static void round_for_all (const char *s) { static const struct fmt { const char *suffix; int prec; int emin; int emax; bool ibm_ld; } formats[7] = { { "f", 24, -148, 128, false }, { "", 53, -1073, 1024, false }, { "L", 53, -1073, 1024, false }, /* This is the Intel extended float format. */ { "L", 64, -16444, 16384, false }, /* This is the Motorola extended float format. */ { "L", 64, -16445, 16384, false }, { "L", 106, -1073, 1024, true }, { "L", 113, -16493, 16384, false }, }; mpfr_printf (" TEST (\""); const char *p; for (p = s; *p; p++) { putchar (*p); if ((p - s) % 60 == 59 && p[1]) mpfr_printf ("\"\n\t\""); } mpfr_printf ("\",\n"); int i; for (i = 0; i < 7; i++) { round_str (s, formats[i].suffix, formats[i].prec, formats[i].emin, formats[i].emax, formats[i].ibm_ld); if (i < 6) mpfr_printf (",\n"); } mpfr_printf ("),\n"); } int main (void) { char *p = NULL; size_t len; ssize_t nbytes; while ((nbytes = getline (&p, &len, stdin)) != -1) { if (p[nbytes - 1] == '\n') p[nbytes - 1] = 0; round_for_all (p); free (p); p = NULL; } return 0; }