]> git.ipfire.org Git - thirdparty/glibc.git/blame - stdlib/bug-strtod.c
Fix strtod multiple-precision division bug (bug 26137).
[thirdparty/glibc.git] / stdlib / bug-strtod.c
CommitLineData
5bfcc4d1
UD
1/* Test to strtod etc for numbers like x000...0000.000e-nn.
2 This file is part of the GNU C Library.
d614a753 3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
5bfcc4d1
UD
4 Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
5
6 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
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.
5bfcc4d1
UD
10
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
41bdb6e2 14 Lesser General Public License for more details.
5bfcc4d1 15
41bdb6e2 16 You should have received a copy of the GNU Lesser General Public
59ba27a6 17 License along with the GNU C Library; if not, see
5a82c748 18 <https://www.gnu.org/licenses/>. */
5bfcc4d1
UD
19
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23
dba0832a
PM
24#include "tst-strtod.h"
25
bf5eea32 26#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
dba0832a
PM
27static int \
28test_strto ## FSUF (void) \
29{ \
30 char buf[300]; \
31 int cnt; \
32 int result = 0; \
33 \
34 for (cnt = 0; cnt < 200; ++cnt) \
35 { \
36 ssize_t n; \
37 FTYPE f; \
38 \
39 n = sprintf (buf, "%d", cnt); \
40 memset (buf + n, '0', cnt); \
41 sprintf (buf + n + cnt, ".000e-%d", cnt); \
42 f = strto ## FSUF (buf, NULL); \
43 \
44 if (f != (FTYPE) cnt) \
45 { \
46 char fstr[FSTRLENMAX]; \
47 char fcntstr[FSTRLENMAX]; \
bf5eea32
RS
48 FTOSTR (fstr, sizeof (fstr), "%g", f); \
49 FTOSTR (fcntstr, sizeof (fstr), "%g", (FTYPE) cnt); \
dba0832a
PM
50 printf ("strto" #FSUF "(\"%s\") " \
51 "failed for cnt == %d (%s instead of %s)\n", \
52 buf, cnt, fstr, fcntstr); \
53 result = 1; \
54 } \
55 else \
56 printf ( "strto" #FSUF "() fine for cnt == %d\n", cnt); \
57 } \
58 return result; \
59}
60
61GEN_TEST_STRTOD_FOREACH (TEST_STRTOD)
5bfcc4d1
UD
62
63int
64main (void)
65{
dba0832a 66 return STRTOD_TEST_FOREACH (test_strto);
5bfcc4d1 67}