2 * Copyright (C) 2008 Free Software Foundation
3 * Written by Eric Blake
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. */
28 #define ASSERT(expr) \
33 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
34 /* FIXME abort ();*/status = 1; \
43 /* Subject sequence empty or invalid. */
45 const char input[] = "";
49 result = strtod (input, &ptr);
50 ASSERT (result == 0.0);
51 ASSERT (!signbit (result));
52 ASSERT (ptr == input);
53 ASSERT (errno == 0 || errno == EINVAL);
56 const char input[] = " ";
60 result = strtod (input, &ptr);
61 ASSERT (result == 0.0);
62 ASSERT (!signbit (result));
63 ASSERT (ptr == input);
64 ASSERT (errno == 0 || errno == EINVAL);
67 const char input[] = " +";
71 result = strtod (input, &ptr);
72 ASSERT (result == 0.0);
73 ASSERT (!signbit (result));
74 ASSERT (ptr == input);
75 ASSERT (errno == 0 || errno == EINVAL);
78 const char input[] = " .";
82 result = strtod (input, &ptr);
83 ASSERT (result == 0.0);
84 ASSERT (!signbit (result));
85 ASSERT (ptr == input);
86 ASSERT (errno == 0 || errno == EINVAL);
89 const char input[] = " .e0";
93 result = strtod (input, &ptr);
94 ASSERT (result == 0.0);
95 ASSERT (!signbit (result));
96 ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
97 ASSERT (errno == 0 || errno == EINVAL);
100 const char input[] = " +.e-0";
104 result = strtod (input, &ptr);
105 ASSERT (result == 0.0);
106 ASSERT (!signbit (result));
107 ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
108 ASSERT (errno == 0 || errno == EINVAL);
111 const char input[] = " in";
115 result = strtod (input, &ptr);
116 ASSERT (result == 0.0);
117 ASSERT (!signbit (result));
118 ASSERT (ptr == input);
119 ASSERT (errno == 0 || errno == EINVAL);
122 const char input[] = " na";
126 result = strtod (input, &ptr);
127 ASSERT (result == 0.0);
128 ASSERT (!signbit (result));
129 ASSERT (ptr == input);
130 ASSERT (errno == 0 || errno == EINVAL);
133 /* Simple floating point values. */
135 const char input[] = "1";
139 result = strtod (input, &ptr);
140 ASSERT (result == 1.0);
141 ASSERT (ptr == input + 1);
145 const char input[] = "1.";
149 result = strtod (input, &ptr);
150 ASSERT (result == 1.0);
151 ASSERT (ptr == input + 2);
155 const char input[] = ".5";
159 result = strtod (input, &ptr);
160 /* FIXME - gnulib's version is rather inaccurate. It would be
161 nice to guarantee an exact result, but for now, we settle for a
163 ASSERT (abs (result - 0.5) < DBL_EPSILON);
164 ASSERT (ptr == input + 2);
168 const char input[] = " 1";
172 result = strtod (input, &ptr);
173 ASSERT (result == 1.0);
174 ASSERT (ptr == input + 2);
178 const char input[] = "+1";
182 result = strtod (input, &ptr);
183 ASSERT (result == 1.0);
184 ASSERT (ptr == input + 2);
188 const char input[] = "-1";
192 result = strtod (input, &ptr);
193 ASSERT (result == -1.0);
194 ASSERT (ptr == input + 2);
198 const char input[] = "1e0";
202 result = strtod (input, &ptr);
203 ASSERT (result == 1.0);
204 ASSERT (ptr == input + 3);
208 const char input[] = "1e+0";
212 result = strtod (input, &ptr);
213 ASSERT (result == 1.0);
214 ASSERT (ptr == input + 4);
218 const char input[] = "1e-0";
222 result = strtod (input, &ptr);
223 ASSERT (result == 1.0);
224 ASSERT (ptr == input + 4);
228 const char input[] = "1e1";
232 result = strtod (input, &ptr);
233 ASSERT (result == 10.0);
234 ASSERT (ptr == input + 3);
238 const char input[] = "5e-1";
242 result = strtod (input, &ptr);
243 /* FIXME - gnulib's version is rather inaccurate. It would be
244 nice to guarantee an exact result, but for now, we settle for a
246 ASSERT (abs (result - 0.5) < DBL_EPSILON);
247 ASSERT (ptr == input + 4);
253 const char input[] = "0";
257 result = strtod (input, &ptr);
258 ASSERT (result == 0.0);
259 ASSERT (!signbit (result));
260 ASSERT (ptr == input + 1);
264 const char input[] = ".0";
268 result = strtod (input, &ptr);
269 ASSERT (result == 0.0);
270 ASSERT (!signbit (result));
271 ASSERT (ptr == input + 2);
275 const char input[] = "0e0";
279 result = strtod (input, &ptr);
280 ASSERT (result == 0.0);
281 ASSERT (!signbit (result));
282 ASSERT (ptr == input + 3);
286 const char input[] = "0e+9999999";
290 result = strtod (input, &ptr);
291 ASSERT (result == 0.0);
292 ASSERT (!signbit (result));
293 ASSERT (ptr == input + 10);
297 const char input[] = "0e-9999999";
301 result = strtod (input, &ptr);
302 ASSERT (result == 0.0);
303 ASSERT (!signbit (result));
304 ASSERT (ptr == input + 10);
308 const char input[] = "-0";
312 result = strtod (input, &ptr);
313 ASSERT (result == 0.0);
314 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
315 ASSERT (ptr == input + 2);
321 const char input[] = "1f";
325 result = strtod (input, &ptr);
326 ASSERT (result == 1.0);
327 ASSERT (ptr == input + 1);
331 const char input[] = "1.f";
335 result = strtod (input, &ptr);
336 ASSERT (result == 1.0);
337 ASSERT (ptr == input + 2);
341 const char input[] = "1e";
345 result = strtod (input, &ptr);
346 ASSERT (result == 1.0);
347 ASSERT (ptr == input + 1);
351 const char input[] = "1e+";
355 result = strtod (input, &ptr);
356 ASSERT (result == 1.0);
357 ASSERT (ptr == input + 1);
361 const char input[] = "1e-";
365 result = strtod (input, &ptr);
366 ASSERT (result == 1.0);
367 ASSERT (ptr == input + 1);
371 const char input[] = "1E 2";
375 result = strtod (input, &ptr);
376 ASSERT (result == 1.0); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
377 ASSERT (ptr == input + 1); /* HP-UX 11.11, IRIX 6.5 */
381 const char input[] = "0x";
385 result = strtod (input, &ptr);
386 ASSERT (result == 0.0);
387 ASSERT (!signbit (result));
388 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
392 const char input[] = "00x1";
396 result = strtod (input, &ptr);
397 ASSERT (result == 0.0);
398 ASSERT (!signbit (result));
399 ASSERT (ptr == input + 2);
403 const char input[] = "-0x";
407 result = strtod (input, &ptr);
408 ASSERT (result == 0.0);
409 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
410 ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
414 const char input[] = "0xg";
418 result = strtod (input, &ptr);
419 ASSERT (result == 0.0);
420 ASSERT (!signbit (result));
421 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
425 const char input[] = "0xp";
429 result = strtod (input, &ptr);
430 ASSERT (result == 0.0);
431 ASSERT (!signbit (result));
432 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
436 const char input[] = "0x.";
440 result = strtod (input, &ptr);
441 ASSERT (result == 0.0);
442 ASSERT (!signbit (result));
443 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
447 const char input[] = "0xp+";
451 result = strtod (input, &ptr);
452 ASSERT (result == 0.0);
453 ASSERT (!signbit (result));
454 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
458 const char input[] = "0xp+1";
462 result = strtod (input, &ptr);
463 ASSERT (result == 0.0);
464 ASSERT (!signbit (result));
465 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
469 const char input[] = "0x.p+1";
473 result = strtod (input, &ptr);
474 ASSERT (result == 0.0);
475 ASSERT (!signbit (result));
476 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
480 const char input[] = "1p+1";
484 result = strtod (input, &ptr);
485 ASSERT (result == 1.0);
486 ASSERT (ptr == input + 1);
490 /* Overflow/underflow. */
492 const char input[] = "1E1000000";
496 result = strtod (input, &ptr);
497 ASSERT (result == HUGE_VAL);
498 ASSERT (ptr == input + 9); /* OSF/1 5.1 */
499 ASSERT (errno == ERANGE);
502 const char input[] = "-1E1000000";
506 result = strtod (input, &ptr);
507 ASSERT (result == -HUGE_VAL);
508 ASSERT (ptr == input + 10);
509 ASSERT (errno == ERANGE);
512 const char input[] = "1E-100000";
516 result = strtod (input, &ptr);
517 ASSERT (0.0 <= result && result <= FLT_MIN);
518 ASSERT (!signbit (result));
519 ASSERT (ptr == input + 9);
520 ASSERT (errno == ERANGE);
523 const char input[] = "-1E-100000";
527 result = strtod (input, &ptr);
528 ASSERT (-FLT_MIN <= result && result <= 0.0);
530 /* FIXME - this is glibc bug 5995; POSIX allows returning positive
531 0 on negative underflow, even though quality of implementation
532 demands preserving the sign. Disable this test until fixed
533 glibc is more prevalent. */
534 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* glibc-2.3.6, mingw */
536 ASSERT (ptr == input + 10);
537 ASSERT (errno == ERANGE);
542 const char input[] = "iNf";
546 result = strtod (input, &ptr);
547 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
548 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
549 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
552 const char input[] = "-InF";
556 result = strtod (input, &ptr);
557 ASSERT (result == -HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
558 ASSERT (ptr == input + 4); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 4.0, Solaris 9, mingw */
559 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
562 const char input[] = "infinite";
566 result = strtod (input, &ptr);
567 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
568 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
569 ASSERT (errno == 0); /* OSF/1 4.0 */
572 const char input[] = "infinitY";
576 result = strtod (input, &ptr);
577 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
578 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
579 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
582 const char input[] = "infinitY.";
586 result = strtod (input, &ptr);
587 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
588 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
589 ASSERT (errno == 0); /* OSF/1 4.0 */
592 /* NaN. Some processors set the sign bit of the default NaN, so all
593 we check is that using a sign changes the result. */
595 const char input[] = "-nan";
601 result1 = strtod (input, &ptr1);
602 result2 = strtod (input + 1, &ptr2);
603 #if 1 /* All known CPUs support NaNs. */
604 ASSERT (isnan (result1)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
605 ASSERT (isnan (result2)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
607 /* Sign bits of NaN is a portability sticking point, not worth
609 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
611 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
612 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
613 ASSERT (errno == 0); /* HP-UX 11.11 */
615 ASSERT (result1 == 0.0);
616 ASSERT (result2 == 0.0);
617 ASSERT (!signbit (result1));
618 ASSERT (!signbit (result2));
619 ASSERT (ptr1 == input);
620 ASSERT (ptr2 == input + 1);
621 ASSERT (errno == 0 || errno == EINVAL);
625 const char input[] = "+nan(";
631 result1 = strtod (input, &ptr1);
632 result2 = strtod (input + 1, &ptr2);
633 #if 1 /* All known CPUs support NaNs. */
634 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
635 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
636 ASSERT (!!signbit (result1) == !!signbit (result2));
637 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
638 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
641 ASSERT (result1 == 0.0);
642 ASSERT (result2 == 0.0);
643 ASSERT (!signbit (result1));
644 ASSERT (!signbit (result2));
645 ASSERT (ptr1 == input);
646 ASSERT (ptr2 == input + 1);
647 ASSERT (errno == 0 || errno == EINVAL);
651 const char input[] = "-nan()";
657 result1 = strtod (input, &ptr1);
658 result2 = strtod (input + 1, &ptr2);
659 #if 1 /* All known CPUs support NaNs. */
660 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
661 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
663 /* Sign bits of NaN is a portability sticking point, not worth
665 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
667 ASSERT (ptr1 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
668 ASSERT (ptr2 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
671 ASSERT (result1 == 0.0);
672 ASSERT (result2 == 0.0);
673 ASSERT (!signbit (result1));
674 ASSERT (!signbit (result2));
675 ASSERT (ptr1 == input);
676 ASSERT (ptr2 == input + 1);
677 ASSERT (errno == 0 || errno == EINVAL);
681 const char input[] = " nan().";
685 result = strtod (input, &ptr);
686 #if 1 /* All known CPUs support NaNs. */
687 ASSERT (isnan (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
688 ASSERT (ptr == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
691 ASSERT (result == 0.0);
692 ASSERT (!signbit (result));
693 ASSERT (ptr == input);
694 ASSERT (errno == 0 || errno == EINVAL);
698 /* The behavior of nan(0) is implementation-defined, but all
699 implementations we know of which handle optional
700 n-char-sequences handle nan(0) the same as nan(). */
701 const char input[] = "-nan(0).";
707 result1 = strtod (input, &ptr1);
708 result2 = strtod (input + 1, &ptr2);
709 #if 1 /* All known CPUs support NaNs. */
710 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
711 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
713 /* Sign bits of NaN is a portability sticking point, not worth
715 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
717 ASSERT (ptr1 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
718 ASSERT (ptr2 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
721 ASSERT (result1 == 0.0);
722 ASSERT (result2 == 0.0);
723 ASSERT (!signbit (result1));
724 ASSERT (!signbit (result2));
725 ASSERT (ptr1 == input);
726 ASSERT (ptr2 == input + 1);
727 ASSERT (errno == 0 || errno == EINVAL);
733 const char input[] = "0xa";
737 result = strtod (input, &ptr);
738 ASSERT (result == 10.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
739 ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
743 const char input[] = "0XA";
747 result = strtod (input, &ptr);
748 ASSERT (result == 10.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
749 ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
753 const char input[] = "0x1p";
757 result = strtod (input, &ptr);
758 ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
759 ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
763 const char input[] = "0x1p+";
767 result = strtod (input, &ptr);
768 ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
769 ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
773 const char input[] = "0x1p+1";
777 result = strtod (input, &ptr);
778 ASSERT (result == 2.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
779 ASSERT (ptr == input + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
783 const char input[] = "0x1p+1a";
787 result = strtod (input, &ptr);
788 ASSERT (result == 2.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
789 ASSERT (ptr == input + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
796 char *input = malloc (m + 1);
801 memset (input, '\t', m - 1);
805 result = strtod (input, &ptr);
806 ASSERT (result == 1.0);
807 ASSERT (ptr == input + m);
814 char *input = malloc (m + 1);
819 memset (input, '0', m - 1);
823 result = strtod (input, &ptr);
824 ASSERT (result == 1.0);
825 ASSERT (ptr == input + m);
831 /* Newlib has an artificial limit of 20000 for the exponent. TODO -
832 gnulib should fix this. */
835 char *input = malloc (m + 1);
841 memset (input + 1, '0', m - 10);
853 result = strtod (input, &ptr);
854 ASSERT (result == 1.0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
855 ASSERT (ptr == input + m); /* OSF/1 5.1 */
856 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
862 char *input = malloc (m + 1);
868 memset (input + 1, '0', m - 9);
879 result = strtod (input, &ptr);
880 ASSERT (result == 1.0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
881 ASSERT (ptr == input + m);
882 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
889 char *input = malloc (m + 1);
898 memset (input + 4, '0', m - 3);
901 result = strtod (input, &ptr);
902 ASSERT (result == 0.0);
903 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
904 ASSERT (ptr == input + m);
911 /* TODO - is it worth some tests of rounding for typical IEEE corner
912 cases, such as .5 ULP rounding up to the smallest denormal and
913 not causing underflow, or FLT_MIN - .5 ULP not causing an