1 /* Test of strtold() and c_strtold() in the "C" locale.
2 Copyright (C) 2008-2024 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Eric Blake. */
20 test_function (long double (*my_strtold
) (const char *, char **))
22 /* Subject sequence empty or invalid. */
24 const char input
[] = "";
28 result
= my_strtold (input
, &ptr
);
29 ASSERT (result
== 0.0L);
30 ASSERT (!signbit (result
));
31 ASSERT (ptr
== input
);
32 ASSERT (errno
== 0 || errno
== EINVAL
);
35 const char input
[] = " ";
39 result
= my_strtold (input
, &ptr
);
40 ASSERT (result
== 0.0L);
41 ASSERT (!signbit (result
));
42 ASSERT (ptr
== input
);
43 ASSERT (errno
== 0 || errno
== EINVAL
);
46 const char input
[] = " +";
50 result
= my_strtold (input
, &ptr
);
51 ASSERT (result
== 0.0L);
52 ASSERT (!signbit (result
));
53 ASSERT (ptr
== input
);
54 ASSERT (errno
== 0 || errno
== EINVAL
);
57 const char input
[] = " .";
61 result
= my_strtold (input
, &ptr
);
62 ASSERT (result
== 0.0L);
63 ASSERT (!signbit (result
));
64 ASSERT (ptr
== input
);
65 ASSERT (errno
== 0 || errno
== EINVAL
);
68 const char input
[] = " .e0";
72 result
= my_strtold (input
, &ptr
);
73 ASSERT (result
== 0.0L);
74 ASSERT (!signbit (result
));
75 ASSERT (ptr
== input
); /* IRIX 6.5 */
76 ASSERT (errno
== 0 || errno
== EINVAL
);
79 const char input
[] = " +.e-0";
83 result
= my_strtold (input
, &ptr
);
84 ASSERT (result
== 0.0L);
85 ASSERT (!signbit (result
));
86 ASSERT (ptr
== input
); /* IRIX 6.5 */
87 ASSERT (errno
== 0 || errno
== EINVAL
);
90 const char input
[] = " in";
94 result
= my_strtold (input
, &ptr
);
95 ASSERT (result
== 0.0L);
96 ASSERT (!signbit (result
));
97 ASSERT (ptr
== input
);
98 ASSERT (errno
== 0 || errno
== EINVAL
);
101 const char input
[] = " na";
105 result
= my_strtold (input
, &ptr
);
106 ASSERT (result
== 0.0L);
107 ASSERT (!signbit (result
));
108 ASSERT (ptr
== input
);
109 ASSERT (errno
== 0 || errno
== EINVAL
);
112 /* Simple floating point values. */
114 const char input
[] = "1";
118 result
= my_strtold (input
, &ptr
);
119 ASSERT (result
== 1.0L);
120 ASSERT (ptr
== input
+ 1);
124 const char input
[] = "1.";
128 result
= my_strtold (input
, &ptr
);
129 ASSERT (result
== 1.0L);
130 ASSERT (ptr
== input
+ 2);
134 const char input
[] = ".5";
138 result
= my_strtold (input
, &ptr
);
139 ASSERT (result
== 0.5L);
140 ASSERT (ptr
== input
+ 2);
144 const char input
[] = " 1";
148 result
= my_strtold (input
, &ptr
);
149 ASSERT (result
== 1.0L);
150 ASSERT (ptr
== input
+ 2);
154 const char input
[] = "+1";
158 result
= my_strtold (input
, &ptr
);
159 ASSERT (result
== 1.0L);
160 ASSERT (ptr
== input
+ 2);
164 const char input
[] = "-1";
168 result
= my_strtold (input
, &ptr
);
169 ASSERT (result
== -1.0L);
170 ASSERT (ptr
== input
+ 2);
174 const char input
[] = "1e0";
178 result
= my_strtold (input
, &ptr
);
179 ASSERT (result
== 1.0L);
180 ASSERT (ptr
== input
+ 3);
184 const char input
[] = "1e+0";
188 result
= my_strtold (input
, &ptr
);
189 ASSERT (result
== 1.0L);
190 ASSERT (ptr
== input
+ 4);
194 const char input
[] = "1e-0";
198 result
= my_strtold (input
, &ptr
);
199 ASSERT (result
== 1.0L);
200 ASSERT (ptr
== input
+ 4);
204 const char input
[] = "1e1";
208 result
= my_strtold (input
, &ptr
);
209 ASSERT (result
== 10.0L);
210 ASSERT (ptr
== input
+ 3);
214 const char input
[] = "5e-1";
218 result
= my_strtold (input
, &ptr
);
219 ASSERT (result
== 0.5L);
220 ASSERT (ptr
== input
+ 4);
226 const char input
[] = "0";
230 result
= my_strtold (input
, &ptr
);
231 ASSERT (result
== 0.0L);
232 ASSERT (!signbit (result
));
233 ASSERT (ptr
== input
+ 1);
237 const char input
[] = ".0";
241 result
= my_strtold (input
, &ptr
);
242 ASSERT (result
== 0.0L);
243 ASSERT (!signbit (result
));
244 ASSERT (ptr
== input
+ 2);
248 const char input
[] = "0e0";
252 result
= my_strtold (input
, &ptr
);
253 ASSERT (result
== 0.0L);
254 ASSERT (!signbit (result
));
255 ASSERT (ptr
== input
+ 3);
259 const char input
[] = "0e+9999999";
263 result
= my_strtold (input
, &ptr
);
264 ASSERT (result
== 0.0L);
265 ASSERT (!signbit (result
));
266 ASSERT (ptr
== input
+ 10);
270 const char input
[] = "0e-9999999";
274 result
= my_strtold (input
, &ptr
);
275 ASSERT (result
== 0.0L);
276 ASSERT (!signbit (result
));
277 ASSERT (ptr
== input
+ 10);
281 const char input
[] = "-0";
285 result
= my_strtold (input
, &ptr
);
286 ASSERT (result
== 0.0L);
287 ASSERT (!!signbit (result
) == !!signbit (minus_zerol
)); /* IRIX 6.5 */
288 ASSERT (ptr
== input
+ 2);
294 const char input
[] = "1f";
298 result
= my_strtold (input
, &ptr
);
299 ASSERT (result
== 1.0L);
300 ASSERT (ptr
== input
+ 1);
304 const char input
[] = "1.f";
308 result
= my_strtold (input
, &ptr
);
309 ASSERT (result
== 1.0L);
310 ASSERT (ptr
== input
+ 2);
314 const char input
[] = "1e";
318 result
= my_strtold (input
, &ptr
);
319 ASSERT (result
== 1.0L);
320 ASSERT (ptr
== input
+ 1);
324 const char input
[] = "1e+";
328 result
= my_strtold (input
, &ptr
);
329 ASSERT (result
== 1.0L);
330 ASSERT (ptr
== input
+ 1);
334 const char input
[] = "1e-";
338 result
= my_strtold (input
, &ptr
);
339 ASSERT (result
== 1.0L);
340 ASSERT (ptr
== input
+ 1);
344 const char input
[] = "1E 2";
348 result
= my_strtold (input
, &ptr
);
349 ASSERT (result
== 1.0L); /* HP-UX 11.31/ia64, IRIX 6.5 */
350 ASSERT (ptr
== input
+ 1); /* HP-UX 11.31/ia64, IRIX 6.5 */
354 const char input
[] = "0x";
358 result
= my_strtold (input
, &ptr
);
359 ASSERT (result
== 0.0L);
360 ASSERT (!signbit (result
));
361 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
365 const char input
[] = "00x1";
369 result
= my_strtold (input
, &ptr
);
370 ASSERT (result
== 0.0L);
371 ASSERT (!signbit (result
));
372 ASSERT (ptr
== input
+ 2);
376 const char input
[] = "-0x";
380 result
= my_strtold (input
, &ptr
);
381 ASSERT (result
== 0.0L);
382 ASSERT (!!signbit (result
) == !!signbit (minus_zerol
)); /* Mac OS X 10.5, IRIX 6.5 */
383 ASSERT (ptr
== input
+ 2); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
387 const char input
[] = "0xg";
391 result
= my_strtold (input
, &ptr
);
392 ASSERT (result
== 0.0L);
393 ASSERT (!signbit (result
));
394 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
398 const char input
[] = "0xp";
402 result
= my_strtold (input
, &ptr
);
403 ASSERT (result
== 0.0L);
404 ASSERT (!signbit (result
));
405 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
409 const char input
[] = "0XP";
413 result
= my_strtold (input
, &ptr
);
414 ASSERT (result
== 0.0L);
415 ASSERT (!signbit (result
));
416 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
420 const char input
[] = "0x.";
424 result
= my_strtold (input
, &ptr
);
425 ASSERT (result
== 0.0L);
426 ASSERT (!signbit (result
));
427 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
431 const char input
[] = "0xp+";
435 result
= my_strtold (input
, &ptr
);
436 ASSERT (result
== 0.0L);
437 ASSERT (!signbit (result
));
438 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
442 const char input
[] = "0xp+1";
446 result
= my_strtold (input
, &ptr
);
447 ASSERT (result
== 0.0L);
448 ASSERT (!signbit (result
));
449 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
453 const char input
[] = "0x.p+1";
457 result
= my_strtold (input
, &ptr
);
458 ASSERT (result
== 0.0L);
459 ASSERT (!signbit (result
));
460 ASSERT (ptr
== input
+ 1); /* glibc-2.3.2, Mac OS X 10.5, Haiku */
464 const char input
[] = "1p+1";
468 result
= my_strtold (input
, &ptr
);
469 ASSERT (result
== 1.0L);
470 ASSERT (ptr
== input
+ 1);
474 const char input
[] = "1P+1";
478 result
= my_strtold (input
, &ptr
);
479 ASSERT (result
== 1.0L);
480 ASSERT (ptr
== input
+ 1);
484 /* Overflow/underflow. */
486 const char input
[] = "1E1000000";
490 result
= my_strtold (input
, &ptr
);
491 ASSERT (result
== HUGE_VALL
);
492 ASSERT (ptr
== input
+ 9);
493 ASSERT (errno
== ERANGE
);
496 const char input
[] = "-1E1000000";
500 result
= my_strtold (input
, &ptr
);
501 ASSERT (result
== -HUGE_VALL
);
502 ASSERT (ptr
== input
+ 10);
503 ASSERT (errno
== ERANGE
);
506 const char input
[] = "1E-100000";
510 result
= my_strtold (input
, &ptr
);
511 ASSERT (0.0L <= result
&& result
<= LDBL_MIN
);
512 ASSERT (!signbit (result
));
513 ASSERT (ptr
== input
+ 9);
514 ASSERT (errno
== ERANGE
);
517 const char input
[] = "-1E-100000";
521 result
= my_strtold (input
, &ptr
);
522 ASSERT (-LDBL_MIN
<= result
&& result
<= 0.0L);
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 (minus_zerol
)); /* glibc-2.3.2, Haiku */
530 ASSERT (ptr
== input
+ 10);
531 ASSERT (errno
== ERANGE
);
534 const char input
[] = "1E 1000000";
538 result
= my_strtold (input
, &ptr
);
539 ASSERT (result
== 1.0L); /* HP-UX 11.31/ia64, IRIX 6.5 */
540 ASSERT (ptr
== input
+ 1); /* HP-UX 11.31/ia64, IRIX 6.5 */
541 ASSERT (errno
== 0); /* HP-UX 11.31/ia64, IRIX 6.5 */
544 const char input
[] = "0x1P 1000000";
548 result
= my_strtold (input
, &ptr
);
549 ASSERT (result
== 1.0L); /* HP-UX 11.31/ia64, IRIX 6.5, mingw */
550 ASSERT (ptr
== input
+ 3); /* HP-UX 11.31/ia64, IRIX 6.5, mingw */
556 const char input
[] = "iNf";
560 result
= my_strtold (input
, &ptr
);
561 ASSERT (result
== HUGE_VALL
); /* IRIX 6.5 */
562 ASSERT (ptr
== input
+ 3); /* IRIX 6.5 */
563 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
566 const char input
[] = "-InF";
570 result
= my_strtold (input
, &ptr
);
571 ASSERT (result
== -HUGE_VALL
); /* IRIX 6.5 */
572 ASSERT (ptr
== input
+ 4); /* IRIX 6.5 */
573 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
576 const char input
[] = "infinite";
580 result
= my_strtold (input
, &ptr
);
581 ASSERT (result
== HUGE_VALL
); /* IRIX 6.5 */
582 ASSERT (ptr
== input
+ 3); /* IRIX 6.5 */
583 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
586 const char input
[] = "infinitY";
590 result
= my_strtold (input
, &ptr
);
591 ASSERT (result
== HUGE_VALL
); /* IRIX 6.5 */
592 ASSERT (ptr
== input
+ 8); /* IRIX 6.5 */
593 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
596 const char input
[] = "infinitY.";
600 result
= my_strtold (input
, &ptr
);
601 ASSERT (result
== HUGE_VALL
); /* IRIX 6.5 */
602 ASSERT (ptr
== input
+ 8); /* IRIX 6.5 */
603 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
606 /* NaN. Some processors set the sign bit of the default NaN, so all
607 we check is that using a sign changes the result. */
609 const char input
[] = "-nan";
615 result1
= my_strtold (input
, &ptr1
);
616 result2
= my_strtold (input
+ 1, &ptr2
);
617 #if 1 /* All known CPUs support NaNs. */
618 ASSERT (isnanl (result1
)); /* IRIX 6.5 */
619 ASSERT (isnanl (result2
)); /* IRIX 6.5 */
621 /* Sign bits of NaN is a portability sticking point, not worth
623 ASSERT (!!signbit (result1
) != !!signbit (result2
));
625 ASSERT (ptr1
== input
+ 4); /* IRIX 6.5 */
626 ASSERT (ptr2
== input
+ 4); /* IRIX 6.5 */
627 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
629 ASSERT (result1
== 0.0L);
630 ASSERT (result2
== 0.0L);
631 ASSERT (!signbit (result1
));
632 ASSERT (!signbit (result2
));
633 ASSERT (ptr1
== input
);
634 ASSERT (ptr2
== input
+ 1);
635 ASSERT (errno
== 0 || errno
== EINVAL
);
639 const char input
[] = "+nan(";
645 result1
= my_strtold (input
, &ptr1
);
646 result2
= my_strtold (input
+ 1, &ptr2
);
647 #if 1 /* All known CPUs support NaNs. */
648 ASSERT (isnanl (result1
)); /* IRIX 6.5 */
649 ASSERT (isnanl (result2
)); /* IRIX 6.5 */
650 ASSERT (!!signbit (result1
) == !!signbit (result2
));
651 ASSERT (ptr1
== input
+ 4); /* Mac OS X 10.5, IRIX 6.5 */
652 ASSERT (ptr2
== input
+ 4); /* Mac OS X 10.5, IRIX 6.5 */
653 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
655 ASSERT (result1
== 0.0L);
656 ASSERT (result2
== 0.0L);
657 ASSERT (!signbit (result1
));
658 ASSERT (!signbit (result2
));
659 ASSERT (ptr1
== input
);
660 ASSERT (ptr2
== input
+ 1);
661 ASSERT (errno
== 0 || errno
== EINVAL
);
665 const char input
[] = "-nan()";
671 result1
= my_strtold (input
, &ptr1
);
672 result2
= my_strtold (input
+ 1, &ptr2
);
673 #if 1 /* All known CPUs support NaNs. */
674 ASSERT (isnanl (result1
)); /* IRIX 6.5 */
675 ASSERT (isnanl (result2
)); /* IRIX 6.5 */
677 /* Sign bits of NaN is a portability sticking point, not worth
679 ASSERT (!!signbit (result1
) != !!signbit (result2
)); /* glibc-2.3.2, musl libc, OpenBSD 6.0, IRIX 6.5, mingw, Haiku */
681 ASSERT (ptr1
== input
+ 6); /* glibc-2.3.2, IRIX 6.5, mingw, Haiku */
682 ASSERT (ptr2
== input
+ 6); /* glibc-2.3.2, IRIX 6.5, mingw, Haiku */
683 ASSERT (errno
== 0); /* HP-UX 11.31/ia64, Haiku */
685 ASSERT (result1
== 0.0L);
686 ASSERT (result2
== 0.0L);
687 ASSERT (!signbit (result1
));
688 ASSERT (!signbit (result2
));
689 ASSERT (ptr1
== input
);
690 ASSERT (ptr2
== input
+ 1);
691 ASSERT (errno
== 0 || errno
== EINVAL
);
695 const char input
[] = " nan().";
699 result
= my_strtold (input
, &ptr
);
700 #if 1 /* All known CPUs support NaNs. */
701 ASSERT (isnanl (result
)); /* IRIX 6.5 */
702 ASSERT (ptr
== input
+ 6); /* glibc-2.3.2, IRIX 6.5, mingw, Haiku */
703 ASSERT (errno
== 0); /* HP-UX 11.31/ia64, Haiku */
705 ASSERT (result
== 0.0L);
706 ASSERT (!signbit (result
));
707 ASSERT (ptr
== input
);
708 ASSERT (errno
== 0 || errno
== EINVAL
);
712 /* The behavior of nan(0) is implementation-defined, but all
713 implementations we know of which handle optional
714 n-char-sequences handle nan(0) the same as nan(). */
715 const char input
[] = "-nan(0).";
721 result1
= my_strtold (input
, &ptr1
);
722 result2
= my_strtold (input
+ 1, &ptr2
);
723 #if 1 /* All known CPUs support NaNs. */
724 ASSERT (isnanl (result1
)); /* IRIX 6.5 */
725 ASSERT (isnanl (result2
)); /* IRIX 6.5 */
727 /* Sign bits of NaN is a portability sticking point, not worth
729 ASSERT (!!signbit (result1
) != !!signbit (result2
));
731 ASSERT (ptr1
== input
+ 7); /* glibc-2.3.2, IRIX 6.5, mingw, Haiku */
732 ASSERT (ptr2
== input
+ 7); /* glibc-2.3.2, IRIX 6.5, mingw, Haiku */
733 ASSERT (errno
== 0); /* HP-UX 11.31/ia64 */
735 ASSERT (result1
== 0.0L);
736 ASSERT (result2
== 0.0L);
737 ASSERT (!signbit (result1
));
738 ASSERT (!signbit (result2
));
739 ASSERT (ptr1
== input
);
740 ASSERT (ptr2
== input
+ 1);
741 ASSERT (errno
== 0 || errno
== EINVAL
);
747 const char input
[] = "0xa";
751 result
= my_strtold (input
, &ptr
);
752 ASSERT (result
== 10.0L); /* IRIX 6.5, mingw */
753 ASSERT (ptr
== input
+ 3); /* IRIX 6.5, mingw */
757 const char input
[] = "0XA";
761 result
= my_strtold (input
, &ptr
);
762 ASSERT (result
== 10.0L); /* IRIX 6.5, mingw */
763 ASSERT (ptr
== input
+ 3); /* IRIX 6.5, mingw */
767 const char input
[] = "0x1p";
771 result
= my_strtold (input
, &ptr
);
772 ASSERT (result
== 1.0L); /* IRIX 6.5, mingw */
773 ASSERT (ptr
== input
+ 3); /* IRIX 6.5, mingw */
777 const char input
[] = "0x1p+";
781 result
= my_strtold (input
, &ptr
);
782 ASSERT (result
== 1.0L); /* IRIX 6.5, mingw */
783 ASSERT (ptr
== input
+ 3); /* IRIX 6.5, mingw */
787 const char input
[] = "0x1P+";
791 result
= my_strtold (input
, &ptr
);
792 ASSERT (result
== 1.0L); /* IRIX 6.5, mingw */
793 ASSERT (ptr
== input
+ 3); /* IRIX 6.5, mingw */
797 const char input
[] = "0x1p+1";
801 result
= my_strtold (input
, &ptr
);
802 ASSERT (result
== 2.0L); /* IRIX 6.5, mingw */
803 ASSERT (ptr
== input
+ 6); /* IRIX 6.5, mingw */
807 const char input
[] = "0X1P+1";
811 result
= my_strtold (input
, &ptr
);
812 ASSERT (result
== 2.0L); /* IRIX 6.5, mingw */
813 ASSERT (ptr
== input
+ 6); /* IRIX 6.5, mingw */
817 const char input
[] = "0x1p+1a";
821 result
= my_strtold (input
, &ptr
);
822 ASSERT (result
== 2.0L); /* IRIX 6.5, mingw */
823 ASSERT (ptr
== input
+ 6); /* IRIX 6.5, mingw */
827 const char input
[] = "0x1p 2";
831 result
= my_strtold (input
, &ptr
);
832 ASSERT (result
== 1.0L); /* HP-UX 11.31/ia64, IRIX 6.5, mingw */
833 ASSERT (ptr
== input
+ 3); /* HP-UX 11.31/ia64, IRIX 6.5, mingw */
840 char *input
= malloc (m
+ 1);
845 memset (input
, '\t', m
- 1);
849 result
= my_strtold (input
, &ptr
);
850 ASSERT (result
== 1.0L);
851 ASSERT (ptr
== input
+ m
);
858 char *input
= malloc (m
+ 1);
863 memset (input
, '0', m
- 1);
867 result
= my_strtold (input
, &ptr
);
868 ASSERT (result
== 1.0L);
869 ASSERT (ptr
== input
+ m
);
875 /* Newlib has an artificial limit of 20000 for the exponent. TODO -
876 gnulib should fix this. */
879 char *input
= malloc (m
+ 1);
885 memset (input
+ 1, '0', m
- 10);
897 result
= my_strtold (input
, &ptr
);
898 ASSERT (result
== 1.0L); /* Mac OS X 10.5, FreeBSD 11.0, NetBSD 7.1, OpenBSD 6.0, Minix 3.3, IRIX 6.5, mingw */
899 ASSERT (ptr
== input
+ m
);
900 ASSERT (errno
== 0); /* Mac OS X 10.5, FreeBSD 11.0, NetBSD 7.1, OpenBSD 6.0, Minix 3.3, IRIX 6.5, mingw */
906 char *input
= malloc (m
+ 1);
912 memset (input
+ 1, '0', m
- 9);
923 result
= my_strtold (input
, &ptr
);
924 ASSERT (result
== 1.0L); /* Mac OS X 10.5, FreeBSD 11.0, NetBSD 7.1, OpenBSD 6.0, Minix 3.3, IRIX 6.5, mingw */
925 ASSERT (ptr
== input
+ m
);
926 ASSERT (errno
== 0); /* Mac OS X 10.5, FreeBSD 11.0, NetBSD 7.1, OpenBSD 6.0, Minix 3.3, IRIX 6.5, mingw */
933 char *input
= malloc (m
+ 1);
942 memset (input
+ 4, '0', m
- 3);
945 result
= my_strtold (input
, &ptr
);
946 ASSERT (result
== 0.0L);
947 ASSERT (!!signbit (result
) == !!signbit (minus_zerol
)); /* IRIX 6.5 */
948 ASSERT (ptr
== input
+ m
);
955 /* TODO - is it worth some tests of rounding for typical IEEE corner
956 cases, such as .5 ULP rounding up to the smallest denormal and
957 not causing underflow, or LDBL_MIN - .5 ULP not causing an