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 ASSERT (result == 0.5);
161 ASSERT (ptr == input + 2);
165 const char input[] = " 1";
169 result = strtod (input, &ptr);
170 ASSERT (result == 1.0);
171 ASSERT (ptr == input + 2);
175 const char input[] = "+1";
179 result = strtod (input, &ptr);
180 ASSERT (result == 1.0);
181 ASSERT (ptr == input + 2);
185 const char input[] = "-1";
189 result = strtod (input, &ptr);
190 ASSERT (result == -1.0);
191 ASSERT (ptr == input + 2);
195 const char input[] = "1e0";
199 result = strtod (input, &ptr);
200 ASSERT (result == 1.0);
201 ASSERT (ptr == input + 3);
205 const char input[] = "1e+0";
209 result = strtod (input, &ptr);
210 ASSERT (result == 1.0);
211 ASSERT (ptr == input + 4);
215 const char input[] = "1e-0";
219 result = strtod (input, &ptr);
220 ASSERT (result == 1.0);
221 ASSERT (ptr == input + 4);
225 const char input[] = "1e1";
229 result = strtod (input, &ptr);
230 ASSERT (result == 10.0);
231 ASSERT (ptr == input + 3);
235 const char input[] = "5e-1";
239 result = strtod (input, &ptr);
240 ASSERT (result == 0.5);
241 ASSERT (ptr == input + 4);
247 const char input[] = "0";
251 result = strtod (input, &ptr);
252 ASSERT (result == 0.0);
253 ASSERT (!signbit (result));
254 ASSERT (ptr == input + 1);
258 const char input[] = ".0";
262 result = strtod (input, &ptr);
263 ASSERT (result == 0.0);
264 ASSERT (!signbit (result));
265 ASSERT (ptr == input + 2);
269 const char input[] = "0e0";
273 result = strtod (input, &ptr);
274 ASSERT (result == 0.0);
275 ASSERT (!signbit (result));
276 ASSERT (ptr == input + 3);
280 const char input[] = "0e+9999999";
284 result = strtod (input, &ptr);
285 ASSERT (result == 0.0);
286 ASSERT (!signbit (result));
287 ASSERT (ptr == input + 10);
291 const char input[] = "0e-9999999";
295 result = strtod (input, &ptr);
296 ASSERT (result == 0.0);
297 ASSERT (!signbit (result));
298 ASSERT (ptr == input + 10);
302 const char input[] = "-0";
306 result = strtod (input, &ptr);
307 ASSERT (result == 0.0);
308 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
309 ASSERT (ptr == input + 2);
315 const char input[] = "1f";
319 result = strtod (input, &ptr);
320 ASSERT (result == 1.0);
321 ASSERT (ptr == input + 1);
325 const char input[] = "1.f";
329 result = strtod (input, &ptr);
330 ASSERT (result == 1.0);
331 ASSERT (ptr == input + 2);
335 const char input[] = "1e";
339 result = strtod (input, &ptr);
340 ASSERT (result == 1.0);
341 ASSERT (ptr == input + 1);
345 const char input[] = "1e+";
349 result = strtod (input, &ptr);
350 ASSERT (result == 1.0);
351 ASSERT (ptr == input + 1);
355 const char input[] = "1e-";
359 result = strtod (input, &ptr);
360 ASSERT (result == 1.0);
361 ASSERT (ptr == input + 1);
365 const char input[] = "1E 2";
369 result = strtod (input, &ptr);
370 ASSERT (result == 1.0); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
371 ASSERT (ptr == input + 1); /* HP-UX 11.11, IRIX 6.5 */
375 const char input[] = "0x";
379 result = strtod (input, &ptr);
380 ASSERT (result == 0.0);
381 ASSERT (!signbit (result));
382 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
386 const char input[] = "00x1";
390 result = strtod (input, &ptr);
391 ASSERT (result == 0.0);
392 ASSERT (!signbit (result));
393 ASSERT (ptr == input + 2);
397 const char input[] = "-0x";
401 result = strtod (input, &ptr);
402 ASSERT (result == 0.0);
403 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
404 ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
408 const char input[] = "0xg";
412 result = strtod (input, &ptr);
413 ASSERT (result == 0.0);
414 ASSERT (!signbit (result));
415 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
419 const char input[] = "0xp";
423 result = strtod (input, &ptr);
424 ASSERT (result == 0.0);
425 ASSERT (!signbit (result));
426 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
430 const char input[] = "0x.";
434 result = strtod (input, &ptr);
435 ASSERT (result == 0.0);
436 ASSERT (!signbit (result));
437 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
441 const char input[] = "0xp+";
445 result = strtod (input, &ptr);
446 ASSERT (result == 0.0);
447 ASSERT (!signbit (result));
448 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
452 const char input[] = "0xp+1";
456 result = strtod (input, &ptr);
457 ASSERT (result == 0.0);
458 ASSERT (!signbit (result));
459 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
463 const char input[] = "0x.p+1";
467 result = strtod (input, &ptr);
468 ASSERT (result == 0.0);
469 ASSERT (!signbit (result));
470 ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
474 const char input[] = "1p+1";
478 result = strtod (input, &ptr);
479 ASSERT (result == 1.0);
480 ASSERT (ptr == input + 1);
484 /* Overflow/underflow. */
486 const char input[] = "1E1000000";
490 result = strtod (input, &ptr);
491 ASSERT (result == HUGE_VAL);
492 ASSERT (ptr == input + 9); /* OSF/1 5.1 */
493 ASSERT (errno == ERANGE);
496 const char input[] = "-1E1000000";
500 result = strtod (input, &ptr);
501 ASSERT (result == -HUGE_VAL);
502 ASSERT (ptr == input + 10);
503 ASSERT (errno == ERANGE);
506 const char input[] = "1E-100000";
510 result = strtod (input, &ptr);
511 ASSERT (0.0 <= result && result <= FLT_MIN);
512 ASSERT (!signbit (result));
513 ASSERT (ptr == input + 9);
514 ASSERT (errno == ERANGE);
517 const char input[] = "-1E-100000";
521 result = strtod (input, &ptr);
522 ASSERT (-FLT_MIN <= result && result <= 0.0);
524 /* FIXME - this is glibc bug 5995; POSIX allows returning positive
525 0 on negative underflow, even though quality of implementation
526 demands preserving the sign. Disable this test until fixed
527 glibc is more prevalent. */
528 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* glibc-2.3.6, mingw */
530 ASSERT (ptr == input + 10);
531 ASSERT (errno == ERANGE);
536 const char input[] = "iNf";
540 result = strtod (input, &ptr);
541 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
542 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
543 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
546 const char input[] = "-InF";
550 result = strtod (input, &ptr);
551 ASSERT (result == -HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
552 ASSERT (ptr == input + 4); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 4.0, Solaris 9, mingw */
553 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
556 const char input[] = "infinite";
560 result = strtod (input, &ptr);
561 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
562 ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
563 ASSERT (errno == 0); /* OSF/1 4.0 */
566 const char input[] = "infinitY";
570 result = strtod (input, &ptr);
571 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
572 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
573 ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
576 const char input[] = "infinitY.";
580 result = strtod (input, &ptr);
581 ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
582 ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
583 ASSERT (errno == 0); /* OSF/1 4.0 */
586 /* NaN. Some processors set the sign bit of the default NaN, so all
587 we check is that using a sign changes the result. */
589 const char input[] = "-nan";
595 result1 = strtod (input, &ptr1);
596 result2 = strtod (input + 1, &ptr2);
597 #if 1 /* All known CPUs support NaNs. */
598 ASSERT (isnan (result1)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
599 ASSERT (isnan (result2)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
601 /* Sign bits of NaN is a portability sticking point, not worth
603 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
605 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
606 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
607 ASSERT (errno == 0); /* HP-UX 11.11 */
609 ASSERT (result1 == 0.0);
610 ASSERT (result2 == 0.0);
611 ASSERT (!signbit (result1));
612 ASSERT (!signbit (result2));
613 ASSERT (ptr1 == input);
614 ASSERT (ptr2 == input + 1);
615 ASSERT (errno == 0 || errno == EINVAL);
619 const char input[] = "+nan(";
625 result1 = strtod (input, &ptr1);
626 result2 = strtod (input + 1, &ptr2);
627 #if 1 /* All known CPUs support NaNs. */
628 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
629 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
630 ASSERT (!!signbit (result1) == !!signbit (result2));
631 ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
632 ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
635 ASSERT (result1 == 0.0);
636 ASSERT (result2 == 0.0);
637 ASSERT (!signbit (result1));
638 ASSERT (!signbit (result2));
639 ASSERT (ptr1 == input);
640 ASSERT (ptr2 == input + 1);
641 ASSERT (errno == 0 || errno == EINVAL);
645 const char input[] = "-nan()";
651 result1 = strtod (input, &ptr1);
652 result2 = strtod (input + 1, &ptr2);
653 #if 1 /* All known CPUs support NaNs. */
654 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
655 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
657 /* Sign bits of NaN is a portability sticking point, not worth
659 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
661 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 */
662 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 */
665 ASSERT (result1 == 0.0);
666 ASSERT (result2 == 0.0);
667 ASSERT (!signbit (result1));
668 ASSERT (!signbit (result2));
669 ASSERT (ptr1 == input);
670 ASSERT (ptr2 == input + 1);
671 ASSERT (errno == 0 || errno == EINVAL);
675 const char input[] = " nan().";
679 result = strtod (input, &ptr);
680 #if 1 /* All known CPUs support NaNs. */
681 ASSERT (isnan (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
682 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 */
685 ASSERT (result == 0.0);
686 ASSERT (!signbit (result));
687 ASSERT (ptr == input);
688 ASSERT (errno == 0 || errno == EINVAL);
692 /* The behavior of nan(0) is implementation-defined, but all
693 implementations we know of which handle optional
694 n-char-sequences handle nan(0) the same as nan(). */
695 const char input[] = "-nan(0).";
701 result1 = strtod (input, &ptr1);
702 result2 = strtod (input + 1, &ptr2);
703 #if 1 /* All known CPUs support NaNs. */
704 ASSERT (isnan (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
705 ASSERT (isnan (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
707 /* Sign bits of NaN is a portability sticking point, not worth
709 ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
711 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 */
712 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 */
715 ASSERT (result1 == 0.0);
716 ASSERT (result2 == 0.0);
717 ASSERT (!signbit (result1));
718 ASSERT (!signbit (result2));
719 ASSERT (ptr1 == input);
720 ASSERT (ptr2 == input + 1);
721 ASSERT (errno == 0 || errno == EINVAL);
727 const char input[] = "0xa";
731 result = strtod (input, &ptr);
732 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 */
733 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 */
737 const char input[] = "0XA";
741 result = strtod (input, &ptr);
742 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 */
743 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 */
747 const char input[] = "0x1p";
751 result = strtod (input, &ptr);
752 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 */
753 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 */
757 const char input[] = "0x1p+";
761 result = strtod (input, &ptr);
762 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 */
763 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 */
767 const char input[] = "0x1p+1";
771 result = strtod (input, &ptr);
772 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 */
773 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 */
777 const char input[] = "0x1p+1a";
781 result = strtod (input, &ptr);
782 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 */
783 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 */
790 char *input = malloc (m + 1);
795 memset (input, '\t', m - 1);
799 result = strtod (input, &ptr);
800 ASSERT (result == 1.0);
801 ASSERT (ptr == input + m);
808 char *input = malloc (m + 1);
813 memset (input, '0', m - 1);
817 result = strtod (input, &ptr);
818 ASSERT (result == 1.0);
819 ASSERT (ptr == input + m);
825 /* Newlib has an artificial limit of 20000 for the exponent. TODO -
826 gnulib should fix this. */
829 char *input = malloc (m + 1);
835 memset (input + 1, '0', m - 10);
847 result = strtod (input, &ptr);
848 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 */
849 ASSERT (ptr == input + m); /* OSF/1 5.1 */
850 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
856 char *input = malloc (m + 1);
862 memset (input + 1, '0', m - 9);
873 result = strtod (input, &ptr);
874 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 */
875 ASSERT (ptr == input + m);
876 ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
883 char *input = malloc (m + 1);
892 memset (input + 4, '0', m - 3);
895 result = strtod (input, &ptr);
896 ASSERT (result == 0.0);
897 ASSERT (!!signbit (result) == !!signbit (-0.0)); /* IRIX 6.5, OSF/1 4.0 */
898 ASSERT (ptr == input + m);
905 /* TODO - is it worth some tests of rounding for typical IEEE corner
906 cases, such as .5 ULP rounding up to the smallest denormal and
907 not causing underflow, or FLT_MIN - .5 ULP not causing an