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 #include "isnand-nolibm.h"
30 #define ASSERT(expr) \
35 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
37 /* FIXME abort ();*/status = 1; \
42 /* Avoid requiring -lm just for fabs. */
43 #define FABS(d) ((d) < 0.0 ? -(d) : (d))
49 /* Subject sequence empty or invalid. */
51 const char input[] = "";
55 result = strtod (input, &ptr);
56 ASSERT (result == 0.0);
57 ASSERT (!signbit (result));
58 ASSERT (ptr == input);
59 ASSERT (errno == 0 || errno == EINVAL);
62 const char input[] = " ";
66 result = strtod (input, &ptr);
67 ASSERT (result == 0.0);
68 ASSERT (!signbit (result));
69 ASSERT (ptr == input);
70 ASSERT (errno == 0 || errno == EINVAL);
73 const char input[] = " +";
77 result = strtod (input, &ptr);
78 ASSERT (result == 0.0);
79 ASSERT (!signbit (result));
80 ASSERT (ptr == input);
81 ASSERT (errno == 0 || errno == EINVAL);
84 const char input[] = " .";
88 result = strtod (input, &ptr);
89 ASSERT (result == 0.0);
90 ASSERT (!signbit (result));
91 ASSERT (ptr == input);
92 ASSERT (errno == 0 || errno == EINVAL);
95 const char input[] = " .e0";
99 result = strtod (input, &ptr);
100 ASSERT (result == 0.0);
101 ASSERT (!signbit (result));
102 ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
103 ASSERT (errno == 0 || errno == EINVAL);
106 const char input[] = " +.e-0";
110 result = strtod (input, &ptr);
111 ASSERT (result == 0.0);
112 ASSERT (!signbit (result));
113 ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
114 ASSERT (errno == 0 || errno == EINVAL);
117 const char input[] = " in";
121 result = strtod (input, &ptr);
122 ASSERT (result == 0.0);
123 ASSERT (!signbit (result));
124 ASSERT (ptr == input);
125 ASSERT (errno == 0 || errno == EINVAL);
128 const char input[] = " na";
132 result = strtod (input, &ptr);
133 ASSERT (result == 0.0);
134 ASSERT (!signbit (result));
135 ASSERT (ptr == input);
136 ASSERT (errno == 0 || errno == EINVAL);
139 /* Simple floating point values. */
141 const char input[] = "1";
145 result = strtod (input, &ptr);
146 ASSERT (result == 1.0);
147 ASSERT (ptr == input + 1);
151 const char input[] = "1.";
155 result = strtod (input, &ptr);
156 ASSERT (result == 1.0);
157 ASSERT (ptr == input + 2);
161 const char input[] = ".5";
165 result = strtod (input, &ptr);
166 /* FIXME - gnulib's version is rather inaccurate. It would be
167 nice to guarantee an exact result, but for now, we settle for a
169 ASSERT (FABS (result - 0.5) < DBL_EPSILON);
170 ASSERT (ptr == input + 2);
174 const char input[] = " 1";
178 result = strtod (input, &ptr);
179 ASSERT (result == 1.0);
180 ASSERT (ptr == input + 2);
184 const char input[] = "+1";
188 result = strtod (input, &ptr);
189 ASSERT (result == 1.0);
190 ASSERT (ptr == input + 2);
194 const char input[] = "-1";
198 result = strtod (input, &ptr);
199 ASSERT (result == -1.0);
200 ASSERT (ptr == input + 2);
204 const char input[] = "1e0";
208 result = strtod (input, &ptr);
209 ASSERT (result == 1.0);
210 ASSERT (ptr == input + 3);
214 const char input[] = "1e+0";
218 result = strtod (input, &ptr);
219 ASSERT (result == 1.0);
220 ASSERT (ptr == input + 4);
224 const char input[] = "1e-0";
228 result = strtod (input, &ptr);
229 ASSERT (result == 1.0);
230 ASSERT (ptr == input + 4);
234 const char input[] = "1e1";
238 result = strtod (input, &ptr);
239 ASSERT (result == 10.0);
240 ASSERT (ptr == input + 3);
244 const char input[] = "5e-1";
248 result = strtod (input, &ptr);
249 /* FIXME - gnulib's version is rather inaccurate. It would be
250 nice to guarantee an exact result, but for now, we settle for a
252 ASSERT (FABS (result - 0.5) < DBL_EPSILON);
253 ASSERT (ptr == input + 4);
259 const char input[] = "0";
263 result = strtod (input, &ptr);
264 ASSERT (result == 0.0);
265 ASSERT (!signbit (result));
266 ASSERT (ptr == input + 1);
270 const char input[] = ".0";
274 result = strtod (input, &ptr);
275 ASSERT (result == 0.0);
276 ASSERT (!signbit (result));
277 ASSERT (ptr == input + 2);
281 const char input[] = "0e0";
285 result = strtod (input, &ptr);
286 ASSERT (result == 0.0);
287 ASSERT (!signbit (result));
288 ASSERT (ptr == input + 3);
292 const char input[] = "0e+9999999";
296 result = strtod (input, &ptr);
297 ASSERT (result == 0.0);
298 ASSERT (!signbit (result));
299 ASSERT (ptr == input + 10);
303 const char input[] = "0e-9999999";
307 result = strtod (input, &ptr);
308 ASSERT (result == 0.0);
309 ASSERT (!signbit (result));
310 ASSERT (ptr == input + 10);
314 const char input[] = "-0";
318 result = strtod (input, &ptr);
319 ASSERT (result == 0.0);
320 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
321 ASSERT (ptr == input + 2);
327 const char input[] = "1f";
331 result = strtod (input, &ptr);
332 ASSERT (result == 1.0);
333 ASSERT (ptr == input + 1);
337 const char input[] = "1.f";
341 result = strtod (input, &ptr);
342 ASSERT (result == 1.0);
343 ASSERT (ptr == input + 2);
347 const char input[] = "1e";
351 result = strtod (input, &ptr);
352 ASSERT (result == 1.0);
353 ASSERT (ptr == input + 1);
357 const char input[] = "1e+";
361 result = strtod (input, &ptr);
362 ASSERT (result == 1.0);
363 ASSERT (ptr == input + 1);
367 const char input[] = "1e-";
371 result = strtod (input, &ptr);
372 ASSERT (result == 1.0);
373 ASSERT (ptr == input + 1);
377 const char input[] = "1E 2";
381 result = strtod (input, &ptr);
382 ASSERT (result == 1.0); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
383 ASSERT (ptr == input + 1); /* HP-UX 11.11, IRIX 6.5 */
387 const char input[] = "0x";
391 result = strtod (input, &ptr);
392 ASSERT (result == 0.0);
393 ASSERT (!signbit (result));
394 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
398 const char input[] = "00x1";
402 result = strtod (input, &ptr);
403 ASSERT (result == 0.0);
404 ASSERT (!signbit (result));
405 ASSERT (ptr == input + 2);
409 const char input[] = "-0x";
413 result = strtod (input, &ptr);
414 ASSERT (result == 0.0);
415 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
416 ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
420 const char input[] = "0xg";
424 result = strtod (input, &ptr);
425 ASSERT (result == 0.0);
426 ASSERT (!signbit (result));
427 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
431 const char input[] = "0xp";
435 result = strtod (input, &ptr);
436 ASSERT (result == 0.0);
437 ASSERT (!signbit (result));
438 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
442 const char input[] = "0x.";
446 result = strtod (input, &ptr);
447 ASSERT (result == 0.0);
448 ASSERT (!signbit (result));
449 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
453 const char input[] = "0xp+";
457 result = strtod (input, &ptr);
458 ASSERT (result == 0.0);
459 ASSERT (!signbit (result));
460 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
464 const char input[] = "0xp+1";
468 result = strtod (input, &ptr);
469 ASSERT (result == 0.0);
470 ASSERT (!signbit (result));
471 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
475 const char input[] = "0x.p+1";
479 result = strtod (input, &ptr);
480 ASSERT (result == 0.0);
481 ASSERT (!signbit (result));
482 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
486 const char input[] = "1p+1";
490 result = strtod (input, &ptr);
491 ASSERT (result == 1.0);
492 ASSERT (ptr == input + 1);
496 /* Overflow/underflow. */
498 const char input[] = "1E1000000";
502 result = strtod (input, &ptr);
503 ASSERT (result == HUGE_VAL);
504 ASSERT (ptr == input + 9); /* OSF/1 5.1 */
505 ASSERT (errno == ERANGE);
508 const char input[] = "-1E1000000";
512 result = strtod (input, &ptr);
513 ASSERT (result == -HUGE_VAL);
514 ASSERT (ptr == input + 10);
515 ASSERT (errno == ERANGE);
518 const char input[] = "1E-100000";
522 result = strtod (input, &ptr);
523 ASSERT (0.0 <= result && result <= DBL_MIN);
524 ASSERT (!signbit (result));
525 ASSERT (ptr == input + 9);
526 ASSERT (errno == ERANGE);
529 const char input[] = "-1E-100000";
533 result = strtod (input, &ptr);
534 ASSERT (-DBL_MIN <= result && result <= 0.0);
536 /* FIXME - this is glibc bug 5995; POSIX allows returning positive
537 0 on negative underflow, even though quality of implementation
538 demands preserving the sign. Disable this test until fixed
539 glibc is more prevalent. */
540 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* glibc-2.3.6, mingw */
542 ASSERT (ptr == input + 10);
543 ASSERT (errno == ERANGE);
548 const char input[] = "iNf";
552 result = strtod (input, &ptr);
553 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
554 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
555 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
558 const char input[] = "-InF";
562 result = strtod (input, &ptr);
563 ASSERT (result == -HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
564 ASSERT (ptr == input + 4); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 4.0, Solaris 9, mingw */
565 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
568 const char input[] = "infinite";
572 result = strtod (input, &ptr);
573 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
574 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
575 ASSERT (errno == 0); /* OSF/1 4.0 */
578 const char input[] = "infinitY";
582 result = strtod (input, &ptr);
583 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
584 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
585 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
588 const char input[] = "infinitY.";
592 result = strtod (input, &ptr);
593 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
594 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
595 ASSERT (errno == 0); /* OSF/1 4.0 */
598 /* NaN. Some processors set the sign bit of the default NaN, so all
599 we check is that using a sign changes the result. */
601 const char input[] = "-nan";
607 result1 = strtod (input, &ptr1);
608 result2 = strtod (input + 1, &ptr2);
609 #if 1 /* All known CPUs support NaNs. */
610 ASSERT (isnand (result1)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
611 ASSERT (isnand (result2)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
613 /* Sign bits of NaN is a portability sticking point, not worth
615 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
617 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
618 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
619 ASSERT (errno == 0); /* HP-UX 11.11 */
621 ASSERT (result1 == 0.0);
622 ASSERT (result2 == 0.0);
623 ASSERT (!signbit (result1));
624 ASSERT (!signbit (result2));
625 ASSERT (ptr1 == input);
626 ASSERT (ptr2 == input + 1);
627 ASSERT (errno == 0 || errno == EINVAL);
631 const char input[] = "+nan(";
637 result1 = strtod (input, &ptr1);
638 result2 = strtod (input + 1, &ptr2);
639 #if 1 /* All known CPUs support NaNs. */
640 ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
641 ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
642 ASSERT (!!signbit (result1) == !!signbit (result2));
643 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
644 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
647 ASSERT (result1 == 0.0);
648 ASSERT (result2 == 0.0);
649 ASSERT (!signbit (result1));
650 ASSERT (!signbit (result2));
651 ASSERT (ptr1 == input);
652 ASSERT (ptr2 == input + 1);
653 ASSERT (errno == 0 || errno == EINVAL);
657 const char input[] = "-nan()";
663 result1 = strtod (input, &ptr1);
664 result2 = strtod (input + 1, &ptr2);
665 #if 1 /* All known CPUs support NaNs. */
666 ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
667 ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
669 /* Sign bits of NaN is a portability sticking point, not worth
671 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
673 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 */
674 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 */
677 ASSERT (result1 == 0.0);
678 ASSERT (result2 == 0.0);
679 ASSERT (!signbit (result1));
680 ASSERT (!signbit (result2));
681 ASSERT (ptr1 == input);
682 ASSERT (ptr2 == input + 1);
683 ASSERT (errno == 0 || errno == EINVAL);
687 const char input[] = " nan().";
691 result = strtod (input, &ptr);
692 #if 1 /* All known CPUs support NaNs. */
693 ASSERT (isnand (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
694 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 */
697 ASSERT (result == 0.0);
698 ASSERT (!signbit (result));
699 ASSERT (ptr == input);
700 ASSERT (errno == 0 || errno == EINVAL);
704 /* The behavior of nan(0) is implementation-defined, but all
705 implementations we know of which handle optional
706 n-char-sequences handle nan(0) the same as nan(). */
707 const char input[] = "-nan(0).";
713 result1 = strtod (input, &ptr1);
714 result2 = strtod (input + 1, &ptr2);
715 #if 1 /* All known CPUs support NaNs. */
716 ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
717 ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
719 /* Sign bits of NaN is a portability sticking point, not worth
721 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
723 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 */
724 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 */
727 ASSERT (result1 == 0.0);
728 ASSERT (result2 == 0.0);
729 ASSERT (!signbit (result1));
730 ASSERT (!signbit (result2));
731 ASSERT (ptr1 == input);
732 ASSERT (ptr2 == input + 1);
733 ASSERT (errno == 0 || errno == EINVAL);
739 const char input[] = "0xa";
743 result = strtod (input, &ptr);
744 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 */
745 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 */
749 const char input[] = "0XA";
753 result = strtod (input, &ptr);
754 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 */
755 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 */
759 const char input[] = "0x1p";
763 result = strtod (input, &ptr);
764 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 */
765 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 */
769 const char input[] = "0x1p+";
773 result = strtod (input, &ptr);
774 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 */
775 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 */
779 const char input[] = "0x1p+1";
783 result = strtod (input, &ptr);
784 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 */
785 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 */
789 const char input[] = "0x1p+1a";
793 result = strtod (input, &ptr);
794 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 */
795 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 */
802 char *input = malloc (m + 1);
807 memset (input, '\t', m - 1);
811 result = strtod (input, &ptr);
812 ASSERT (result == 1.0);
813 ASSERT (ptr == input + m);
820 char *input = malloc (m + 1);
825 memset (input, '0', m - 1);
829 result = strtod (input, &ptr);
830 ASSERT (result == 1.0);
831 ASSERT (ptr == input + m);
837 /* Newlib has an artificial limit of 20000 for the exponent. TODO -
838 gnulib should fix this. */
841 char *input = malloc (m + 1);
847 memset (input + 1, '0', m - 10);
859 result = strtod (input, &ptr);
860 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 */
861 ASSERT (ptr == input + m); /* OSF/1 5.1 */
862 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
868 char *input = malloc (m + 1);
874 memset (input + 1, '0', m - 9);
885 result = strtod (input, &ptr);
886 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 */
887 ASSERT (ptr == input + m);
888 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
895 char *input = malloc (m + 1);
904 memset (input + 4, '0', m - 3);
907 result = strtod (input, &ptr);
908 ASSERT (result == 0.0);
909 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
910 ASSERT (ptr == input + m);
917 /* TODO - is it worth some tests of rounding for typical IEEE corner
918 cases, such as .5 ULP rounding up to the smallest denormal and
919 not causing underflow, or DBL_MIN - .5 ULP not causing an