1 /* Test of strtof() and c_strtof() in the "C" locale.
2 Copyright (C) 2008-2025 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 (float (*my_strtof
) (const char *, char **))
22 /* Subject sequence empty or invalid. */
24 const char input
[] = "";
28 result
= my_strtof (input
, &ptr
);
29 ASSERT (result
== 0.0f
);
30 ASSERT (!signbit (result
));
31 ASSERT (ptr
== input
);
32 ASSERT (errno
== 0 || errno
== EINVAL
);
35 const char input
[] = " ";
39 result
= my_strtof (input
, &ptr
);
40 ASSERT (result
== 0.0f
);
41 ASSERT (!signbit (result
));
42 ASSERT (ptr
== input
);
43 ASSERT (errno
== 0 || errno
== EINVAL
);
46 const char input
[] = " +";
50 result
= my_strtof (input
, &ptr
);
51 ASSERT (result
== 0.0f
);
52 ASSERT (!signbit (result
));
53 ASSERT (ptr
== input
);
54 ASSERT (errno
== 0 || errno
== EINVAL
);
57 const char input
[] = " .";
61 result
= my_strtof (input
, &ptr
);
62 ASSERT (result
== 0.0f
);
63 ASSERT (!signbit (result
));
64 ASSERT (ptr
== input
);
65 ASSERT (errno
== 0 || errno
== EINVAL
);
68 const char input
[] = " .e0";
72 result
= my_strtof (input
, &ptr
);
73 ASSERT (result
== 0.0f
);
74 ASSERT (!signbit (result
));
75 ASSERT (ptr
== input
); /* IRIX 6.5, OSF/1 5.1 */
76 ASSERT (errno
== 0 || errno
== EINVAL
);
79 const char input
[] = " +.e-0";
83 result
= my_strtof (input
, &ptr
);
84 ASSERT (result
== 0.0f
);
85 ASSERT (!signbit (result
));
86 ASSERT (ptr
== input
); /* IRIX 6.5, OSF/1 5.1 */
87 ASSERT (errno
== 0 || errno
== EINVAL
);
90 const char input
[] = " in";
94 result
= my_strtof (input
, &ptr
);
95 ASSERT (result
== 0.0f
);
96 ASSERT (!signbit (result
));
97 ASSERT (ptr
== input
);
98 ASSERT (errno
== 0 || errno
== EINVAL
);
101 const char input
[] = " na";
105 result
= my_strtof (input
, &ptr
);
106 ASSERT (result
== 0.0f
);
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_strtof (input
, &ptr
);
119 ASSERT (result
== 1.0f
);
120 ASSERT (ptr
== input
+ 1);
124 const char input
[] = "1.";
128 result
= my_strtof (input
, &ptr
);
129 ASSERT (result
== 1.0f
);
130 ASSERT (ptr
== input
+ 2);
134 const char input
[] = ".5";
138 result
= my_strtof (input
, &ptr
);
139 ASSERT (result
== 0.5f
);
140 ASSERT (ptr
== input
+ 2);
144 const char input
[] = " 1";
148 result
= my_strtof (input
, &ptr
);
149 ASSERT (result
== 1.0f
);
150 ASSERT (ptr
== input
+ 2);
154 const char input
[] = "+1";
158 result
= my_strtof (input
, &ptr
);
159 ASSERT (result
== 1.0f
);
160 ASSERT (ptr
== input
+ 2);
164 const char input
[] = "-1";
168 result
= my_strtof (input
, &ptr
);
169 ASSERT (result
== -1.0f
);
170 ASSERT (ptr
== input
+ 2);
174 const char input
[] = "1e0";
178 result
= my_strtof (input
, &ptr
);
179 ASSERT (result
== 1.0f
);
180 ASSERT (ptr
== input
+ 3);
184 const char input
[] = "1e+0";
188 result
= my_strtof (input
, &ptr
);
189 ASSERT (result
== 1.0f
);
190 ASSERT (ptr
== input
+ 4);
194 const char input
[] = "1e-0";
198 result
= my_strtof (input
, &ptr
);
199 ASSERT (result
== 1.0f
);
200 ASSERT (ptr
== input
+ 4);
204 const char input
[] = "1e1";
208 result
= my_strtof (input
, &ptr
);
209 ASSERT (result
== 10.0f
);
210 ASSERT (ptr
== input
+ 3);
214 const char input
[] = "5e-1";
218 result
= my_strtof (input
, &ptr
);
219 ASSERT (result
== 0.5f
);
220 ASSERT (ptr
== input
+ 4);
226 const char input
[] = "0";
230 result
= my_strtof (input
, &ptr
);
231 ASSERT (result
== 0.0f
);
232 ASSERT (!signbit (result
));
233 ASSERT (ptr
== input
+ 1);
237 const char input
[] = ".0";
241 result
= my_strtof (input
, &ptr
);
242 ASSERT (result
== 0.0f
);
243 ASSERT (!signbit (result
));
244 ASSERT (ptr
== input
+ 2);
248 const char input
[] = "0e0";
252 result
= my_strtof (input
, &ptr
);
253 ASSERT (result
== 0.0f
);
254 ASSERT (!signbit (result
));
255 ASSERT (ptr
== input
+ 3);
259 const char input
[] = "0e+9999999";
263 result
= my_strtof (input
, &ptr
);
264 ASSERT (result
== 0.0f
);
265 ASSERT (!signbit (result
));
266 ASSERT (ptr
== input
+ 10);
270 const char input
[] = "0e-9999999";
274 result
= my_strtof (input
, &ptr
);
275 ASSERT (result
== 0.0f
);
276 ASSERT (!signbit (result
));
277 ASSERT (ptr
== input
+ 10);
281 const char input
[] = "-0";
285 result
= my_strtof (input
, &ptr
);
286 ASSERT (result
== 0.0f
);
287 ASSERT (!!signbit (result
) == !!signbit (minus_zerof
)); /* IRIX 6.5, OSF/1 4.0 */
288 ASSERT (ptr
== input
+ 2);
294 const char input
[] = "1f";
298 result
= my_strtof (input
, &ptr
);
299 ASSERT (result
== 1.0f
);
300 ASSERT (ptr
== input
+ 1);
304 const char input
[] = "1.f";
308 result
= my_strtof (input
, &ptr
);
309 ASSERT (result
== 1.0f
);
310 ASSERT (ptr
== input
+ 2);
314 const char input
[] = "1e";
318 result
= my_strtof (input
, &ptr
);
319 ASSERT (result
== 1.0f
);
320 ASSERT (ptr
== input
+ 1);
324 const char input
[] = "1e+";
328 result
= my_strtof (input
, &ptr
);
329 ASSERT (result
== 1.0f
);
330 ASSERT (ptr
== input
+ 1);
334 const char input
[] = "1e-";
338 result
= my_strtof (input
, &ptr
);
339 ASSERT (result
== 1.0f
);
340 ASSERT (ptr
== input
+ 1);
344 const char input
[] = "1E 2";
348 result
= my_strtof (input
, &ptr
);
349 ASSERT (result
== 1.0f
); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
350 ASSERT (ptr
== input
+ 1); /* HP-UX 11.11, IRIX 6.5 */
354 const char input
[] = "0x";
358 result
= my_strtof (input
, &ptr
);
359 ASSERT (result
== 0.0f
);
360 ASSERT (!signbit (result
));
361 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
365 const char input
[] = "00x1";
369 result
= my_strtof (input
, &ptr
);
370 ASSERT (result
== 0.0f
);
371 ASSERT (!signbit (result
));
372 ASSERT (ptr
== input
+ 2);
376 const char input
[] = "-0x";
380 result
= my_strtof (input
, &ptr
);
381 ASSERT (result
== 0.0f
);
382 ASSERT (!!signbit (result
) == !!signbit (minus_zerof
)); /* Mac OS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
383 ASSERT (ptr
== input
+ 2); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
387 const char input
[] = "0xg";
391 result
= my_strtof (input
, &ptr
);
392 ASSERT (result
== 0.0f
);
393 ASSERT (!signbit (result
));
394 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
398 const char input
[] = "0xp";
402 result
= my_strtof (input
, &ptr
);
403 ASSERT (result
== 0.0f
);
404 ASSERT (!signbit (result
));
405 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
409 const char input
[] = "0XP";
413 result
= my_strtof (input
, &ptr
);
414 ASSERT (result
== 0.0f
);
415 ASSERT (!signbit (result
));
416 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
420 const char input
[] = "0x.";
424 result
= my_strtof (input
, &ptr
);
425 ASSERT (result
== 0.0f
);
426 ASSERT (!signbit (result
));
427 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
431 const char input
[] = "0xp+";
435 result
= my_strtof (input
, &ptr
);
436 ASSERT (result
== 0.0f
);
437 ASSERT (!signbit (result
));
438 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
442 const char input
[] = "0xp+1";
446 result
= my_strtof (input
, &ptr
);
447 ASSERT (result
== 0.0f
);
448 ASSERT (!signbit (result
));
449 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
453 const char input
[] = "0x.p+1";
457 result
= my_strtof (input
, &ptr
);
458 ASSERT (result
== 0.0f
);
459 ASSERT (!signbit (result
));
460 ASSERT (ptr
== input
+ 1); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, AIX 7.1 */
464 const char input
[] = "1p+1";
468 result
= my_strtof (input
, &ptr
);
469 ASSERT (result
== 1.0f
);
470 ASSERT (ptr
== input
+ 1);
474 const char input
[] = "1P+1";
478 result
= my_strtof (input
, &ptr
);
479 ASSERT (result
== 1.0f
);
480 ASSERT (ptr
== input
+ 1);
486 const char input
[] = "1e50";
490 result
= my_strtof (input
, &ptr
);
491 ASSERT (result
== HUGE_VAL
);
492 ASSERT (ptr
== input
+ 4); /* OSF/1 5.1 */
493 ASSERT (errno
== ERANGE
);
496 const char input
[] = "1E1000000";
500 result
= my_strtof (input
, &ptr
);
501 ASSERT (result
== HUGE_VAL
);
502 ASSERT (ptr
== input
+ 9); /* OSF/1 5.1 */
503 ASSERT (errno
== ERANGE
);
506 const char input
[] = "-1E1000000";
510 result
= my_strtof (input
, &ptr
);
511 ASSERT (result
== -HUGE_VAL
);
512 ASSERT (ptr
== input
+ 10);
513 ASSERT (errno
== ERANGE
);
516 /* Gradual underflow, resulting in a denormalized number. */
518 const char input
[] = "1e-40";
522 result
= my_strtof (input
, &ptr
);
523 ASSERT (0.0f
< result
&& result
<= FLT_MIN
);
524 ASSERT (ptr
== input
+ 5);
525 #if !defined _MSC_VER
526 ASSERT (errno
== ERANGE
);
530 const char input
[] = "-1e-40";
534 result
= my_strtof (input
, &ptr
);
535 ASSERT (-FLT_MIN
<= result
&& result
< 0.0f
);
536 ASSERT (ptr
== input
+ 6);
537 #if !defined _MSC_VER
538 ASSERT (errno
== ERANGE
);
542 /* Flush-to-zero underflow. */
544 const char input
[] = "1E-100000";
548 result
= my_strtof (input
, &ptr
);
550 ASSERT (result
== 0.0f
);
551 #else /* This is all that ISO C guarantees. */
552 ASSERT (0.0f
<= result
&& result
<= FLT_MIN
);
554 ASSERT (!signbit (result
));
555 ASSERT (ptr
== input
+ 9);
556 ASSERT (errno
== ERANGE
);
559 const char input
[] = "-1E-100000";
563 result
= my_strtof (input
, &ptr
);
565 ASSERT (result
== 0.0f
);
566 #else /* This is all that ISO C guarantees. */
567 ASSERT (-FLT_MIN
<= result
&& result
<= 0.0f
);
569 /* Negative underflow. Expect a negative sign, although POSIX allows +0.0f.
570 See also <https://sourceware.org/bugzilla/show_bug.cgi?id=5995>. */
571 ASSERT (!!signbit (result
) == !!signbit (minus_zerof
)); /* glibc-2.3.6, mingw */
572 ASSERT (ptr
== input
+ 10);
573 ASSERT (errno
== ERANGE
);
576 /* Space before the exponent. */
578 const char input
[] = "1E 1000000";
582 result
= my_strtof (input
, &ptr
);
583 ASSERT (result
== 1.0f
); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
584 ASSERT (ptr
== input
+ 1); /* HP-UX 11.11, IRIX 6.5 */
588 const char input
[] = "0x1P 1000000";
592 result
= my_strtof (input
, &ptr
);
593 ASSERT (result
== 1.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
594 ASSERT (ptr
== input
+ 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
600 const char input
[] = "iNf";
604 result
= my_strtof (input
, &ptr
);
605 ASSERT (result
== HUGE_VAL
); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
606 ASSERT (ptr
== input
+ 3); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
607 ASSERT (errno
== 0); /* HP-UX 11.11, OSF/1 4.0 */
610 const char input
[] = "-InF";
614 result
= my_strtof (input
, &ptr
);
615 ASSERT (result
== -HUGE_VAL
); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
616 ASSERT (ptr
== input
+ 4); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 4.0, Solaris 9, mingw */
617 ASSERT (errno
== 0); /* HP-UX 11.11, OSF/1 4.0 */
620 const char input
[] = "infinite";
624 result
= my_strtof (input
, &ptr
);
625 ASSERT (result
== HUGE_VAL
); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
626 ASSERT (ptr
== input
+ 3); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
627 ASSERT (errno
== 0); /* OSF/1 4.0 */
630 const char input
[] = "infinitY";
634 result
= my_strtof (input
, &ptr
);
635 ASSERT (result
== HUGE_VAL
); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
636 ASSERT (ptr
== input
+ 8); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
637 ASSERT (errno
== 0); /* HP-UX 11.11, OSF/1 4.0 */
640 const char input
[] = "infinitY.";
644 result
= my_strtof (input
, &ptr
);
645 ASSERT (result
== HUGE_VAL
); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
646 ASSERT (ptr
== input
+ 8); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
647 ASSERT (errno
== 0); /* OSF/1 4.0 */
650 /* NaN. Some processors set the sign bit of the default NaN, so all
651 we check is that using a sign changes the result. */
653 const char input
[] = "-nan";
659 result1
= my_strtof (input
, &ptr1
);
660 result2
= my_strtof (input
+ 1, &ptr2
);
661 #if 1 /* All known CPUs support NaNs. */
662 ASSERT (isnanf (result1
)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
663 ASSERT (isnanf (result2
)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
665 /* Sign bits of NaN is a portability sticking point, not worth
667 ASSERT (!!signbit (result1
) != !!signbit (result2
)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
669 ASSERT (ptr1
== input
+ 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
670 ASSERT (ptr2
== input
+ 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
671 ASSERT (errno
== 0); /* HP-UX 11.11 */
673 ASSERT (result1
== 0.0f
);
674 ASSERT (result2
== 0.0f
);
675 ASSERT (!signbit (result1
));
676 ASSERT (!signbit (result2
));
677 ASSERT (ptr1
== input
);
678 ASSERT (ptr2
== input
+ 1);
679 ASSERT (errno
== 0 || errno
== EINVAL
);
683 const char input
[] = "+nan(";
689 result1
= my_strtof (input
, &ptr1
);
690 result2
= my_strtof (input
+ 1, &ptr2
);
691 #if 1 /* All known CPUs support NaNs. */
692 ASSERT (isnanf (result1
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
693 ASSERT (isnanf (result2
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
694 ASSERT (!!signbit (result1
) == !!signbit (result2
));
695 ASSERT (ptr1
== input
+ 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
696 ASSERT (ptr2
== input
+ 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
699 ASSERT (result1
== 0.0f
);
700 ASSERT (result2
== 0.0f
);
701 ASSERT (!signbit (result1
));
702 ASSERT (!signbit (result2
));
703 ASSERT (ptr1
== input
);
704 ASSERT (ptr2
== input
+ 1);
705 ASSERT (errno
== 0 || errno
== EINVAL
);
709 const char input
[] = "-nan()";
715 result1
= my_strtof (input
, &ptr1
);
716 result2
= my_strtof (input
+ 1, &ptr2
);
717 #if 1 /* All known CPUs support NaNs. */
718 ASSERT (isnanf (result1
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
719 ASSERT (isnanf (result2
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
721 /* Sign bits of NaN is a portability sticking point, not worth
723 ASSERT (!!signbit (result1
) != !!signbit (result2
)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
725 ASSERT (ptr1
== input
+ 6); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
726 ASSERT (ptr2
== input
+ 6); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
729 ASSERT (result1
== 0.0f
);
730 ASSERT (result2
== 0.0f
);
731 ASSERT (!signbit (result1
));
732 ASSERT (!signbit (result2
));
733 ASSERT (ptr1
== input
);
734 ASSERT (ptr2
== input
+ 1);
735 ASSERT (errno
== 0 || errno
== EINVAL
);
739 const char input
[] = " nan().";
743 result
= my_strtof (input
, &ptr
);
744 #if 1 /* All known CPUs support NaNs. */
745 ASSERT (isnanf (result
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
746 ASSERT (ptr
== input
+ 6); /* glibc-2.3.6, Mac OS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
749 ASSERT (result
== 0.0f
);
750 ASSERT (!signbit (result
));
751 ASSERT (ptr
== input
);
752 ASSERT (errno
== 0 || errno
== EINVAL
);
756 /* The behavior of nan(0) is implementation-defined, but all
757 implementations we know of which handle optional
758 n-char-sequences handle nan(0) the same as nan(). */
759 const char input
[] = "-nan(0).";
765 result1
= my_strtof (input
, &ptr1
);
766 result2
= my_strtof (input
+ 1, &ptr2
);
767 #if 1 /* All known CPUs support NaNs. */
768 ASSERT (isnanf (result1
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
769 ASSERT (isnanf (result2
)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
771 /* Sign bits of NaN is a portability sticking point, not worth
773 ASSERT (!!signbit (result1
) != !!signbit (result2
)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
775 ASSERT (ptr1
== input
+ 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
776 ASSERT (ptr2
== input
+ 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
779 ASSERT (result1
== 0.0f
);
780 ASSERT (result2
== 0.0f
);
781 ASSERT (!signbit (result1
));
782 ASSERT (!signbit (result2
));
783 ASSERT (ptr1
== input
);
784 ASSERT (ptr2
== input
+ 1);
785 ASSERT (errno
== 0 || errno
== EINVAL
);
791 const char input
[] = "0xa";
795 result
= my_strtof (input
, &ptr
);
796 ASSERT (result
== 10.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
797 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 */
801 const char input
[] = "0XA";
805 result
= my_strtof (input
, &ptr
);
806 ASSERT (result
== 10.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
807 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 */
811 const char input
[] = "0x1p";
815 result
= my_strtof (input
, &ptr
);
816 ASSERT (result
== 1.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
817 ASSERT (ptr
== input
+ 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
821 const char input
[] = "0x1p+";
825 result
= my_strtof (input
, &ptr
);
826 ASSERT (result
== 1.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
827 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 */
831 const char input
[] = "0x1P+";
835 result
= my_strtof (input
, &ptr
);
836 ASSERT (result
== 1.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
837 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 */
841 const char input
[] = "0x1p+1";
845 result
= my_strtof (input
, &ptr
);
846 ASSERT (result
== 2.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
847 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 */
851 const char input
[] = "0X1P+1";
855 result
= my_strtof (input
, &ptr
);
856 ASSERT (result
== 2.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
857 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 */
861 const char input
[] = "0x1p+1a";
865 result
= my_strtof (input
, &ptr
);
866 ASSERT (result
== 2.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
867 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 */
871 const char input
[] = "0x1p 2";
875 result
= my_strtof (input
, &ptr
);
876 ASSERT (result
== 1.0f
); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
877 ASSERT (ptr
== input
+ 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
884 char *input
= malloc (m
+ 1);
889 memset (input
, '\t', m
- 1);
893 result
= my_strtof (input
, &ptr
);
894 ASSERT (result
== 1.0f
);
895 ASSERT (ptr
== input
+ m
);
902 char *input
= malloc (m
+ 1);
907 memset (input
, '0', m
- 1);
911 result
= my_strtof (input
, &ptr
);
912 ASSERT (result
== 1.0f
);
913 ASSERT (ptr
== input
+ m
);
919 /* Newlib has an artificial limit of 20000 for the exponent. TODO -
920 gnulib should fix this. */
923 char *input
= malloc (m
+ 1);
929 memset (input
+ 1, '0', m
- 10);
941 result
= my_strtof (input
, &ptr
);
942 ASSERT (result
== 1.0f
); /* Mac OS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
943 ASSERT (ptr
== input
+ m
); /* OSF/1 5.1 */
944 ASSERT (errno
== 0); /* Mac OS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
950 char *input
= malloc (m
+ 1);
956 memset (input
+ 1, '0', m
- 9);
967 result
= my_strtof (input
, &ptr
);
968 ASSERT (result
== 1.0f
); /* Mac OS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
969 ASSERT (ptr
== input
+ m
);
970 ASSERT (errno
== 0); /* Mac OS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
977 char *input
= malloc (m
+ 1);
986 memset (input
+ 4, '0', m
- 3);
989 result
= my_strtof (input
, &ptr
);
990 ASSERT (result
== 0.0f
);
991 ASSERT (!!signbit (result
) == !!signbit (minus_zerof
)); /* IRIX 6.5, OSF/1 4.0 */
992 ASSERT (ptr
== input
+ m
);
999 /* TODO - is it worth some tests of rounding for typical IEEE corner
1000 cases, such as .5 ULP rounding up to the smallest denormal and
1001 not causing underflow, or FLT_MIN - .5 ULP not causing an