11ee02192SEnji Cooper /*- 21ee02192SEnji Cooper * Copyright (c) 2002-2009 David Schultz <das@FreeBSD.org> 31ee02192SEnji Cooper * All rights reserved. 41ee02192SEnji Cooper * 51ee02192SEnji Cooper * Redistribution and use in source and binary forms, with or without 61ee02192SEnji Cooper * modification, are permitted provided that the following conditions 71ee02192SEnji Cooper * are met: 81ee02192SEnji Cooper * 1. Redistributions of source code must retain the above copyright 91ee02192SEnji Cooper * notice, this list of conditions and the following disclaimer. 101ee02192SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 111ee02192SEnji Cooper * notice, this list of conditions and the following disclaimer in the 121ee02192SEnji Cooper * documentation and/or other materials provided with the distribution. 131ee02192SEnji Cooper * 141ee02192SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 151ee02192SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 161ee02192SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 171ee02192SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 181ee02192SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 191ee02192SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 201ee02192SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 211ee02192SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 221ee02192SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 231ee02192SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 241ee02192SEnji Cooper * SUCH DAMAGE. 251ee02192SEnji Cooper */ 261ee02192SEnji Cooper 271ee02192SEnji Cooper /* 281ee02192SEnji Cooper * Test for printf() floating point formats. 291ee02192SEnji Cooper */ 301ee02192SEnji Cooper 311ee02192SEnji Cooper #include <sys/cdefs.h> 321ee02192SEnji Cooper __FBSDID("$FreeBSD$"); 331ee02192SEnji Cooper 341ee02192SEnji Cooper #include <err.h> 351ee02192SEnji Cooper #include <fenv.h> 361ee02192SEnji Cooper #include <float.h> 371ee02192SEnji Cooper #include <locale.h> 381ee02192SEnji Cooper #include <math.h> 391ee02192SEnji Cooper #include <stdio.h> 401ee02192SEnji Cooper #include <stdarg.h> 411ee02192SEnji Cooper #include <stdint.h> 421ee02192SEnji Cooper #include <stdlib.h> 431ee02192SEnji Cooper #include <string.h> 441ee02192SEnji Cooper #include <wchar.h> 451ee02192SEnji Cooper 461ee02192SEnji Cooper #include <atf-c.h> 471ee02192SEnji Cooper 481ee02192SEnji Cooper static void 491ee02192SEnji Cooper smash_stack(void) 501ee02192SEnji Cooper { 511ee02192SEnji Cooper static uint32_t junk = 0xdeadbeef; 521ee02192SEnji Cooper uint32_t buf[512]; 53*0e4ff0acSAlex Richardson size_t i; 541ee02192SEnji Cooper 551ee02192SEnji Cooper for (i = 0; i < sizeof(buf) / sizeof(buf[0]); i++) 561ee02192SEnji Cooper buf[i] = junk; 571ee02192SEnji Cooper } 581ee02192SEnji Cooper 591ee02192SEnji Cooper #define testfmt(result, fmt, ...) \ 601ee02192SEnji Cooper _testfmt((result), #__VA_ARGS__, fmt, __VA_ARGS__) 611ee02192SEnji Cooper static void 621ee02192SEnji Cooper _testfmt(const char *result, const char *argstr, const char *fmt,...) 631ee02192SEnji Cooper { 641ee02192SEnji Cooper #define BUF 100 651ee02192SEnji Cooper wchar_t ws[BUF], wfmt[BUF], wresult[BUF]; 661ee02192SEnji Cooper char s[BUF]; 671ee02192SEnji Cooper va_list ap, ap2; 681ee02192SEnji Cooper 691ee02192SEnji Cooper va_start(ap, fmt); 701ee02192SEnji Cooper va_copy(ap2, ap); 711ee02192SEnji Cooper smash_stack(); 721ee02192SEnji Cooper vsnprintf(s, sizeof(s), fmt, ap); 730653d1fbSEnji Cooper ATF_CHECK_MSG(strcmp(result, s) == 0, 74e57c1140SEnji Cooper "printf(\"%s\", %s) ==> [%s], expected [%s]", 751ee02192SEnji Cooper fmt, argstr, s, result); 761ee02192SEnji Cooper 771ee02192SEnji Cooper smash_stack(); 781ee02192SEnji Cooper mbstowcs(ws, s, BUF - 1); 791ee02192SEnji Cooper mbstowcs(wfmt, fmt, BUF - 1); 801ee02192SEnji Cooper mbstowcs(wresult, result, BUF - 1); 811ee02192SEnji Cooper vswprintf(ws, sizeof(ws) / sizeof(ws[0]), wfmt, ap2); 820653d1fbSEnji Cooper ATF_CHECK_MSG(wcscmp(wresult, ws) == 0, 83e57c1140SEnji Cooper "wprintf(\"%ls\", %s) ==> [%ls], expected [%ls]", 841ee02192SEnji Cooper wfmt, argstr, ws, wresult); 850653d1fbSEnji Cooper 863e227991SEnji Cooper va_end(ap); 873e227991SEnji Cooper va_end(ap2); 881ee02192SEnji Cooper } 891ee02192SEnji Cooper 901ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(float_within_limits); 911ee02192SEnji Cooper ATF_TC_BODY(float_within_limits, tc) 921ee02192SEnji Cooper { 931ee02192SEnji Cooper 941ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 951ee02192SEnji Cooper 961ee02192SEnji Cooper /* Basic tests of decimal output functionality. */ 971ee02192SEnji Cooper testfmt(" 1.000000E+00", "%13E", 1.0); 981ee02192SEnji Cooper testfmt(" 1.000000", "%13f", 1.0); 991ee02192SEnji Cooper testfmt(" 1", "%13G", 1.0); 1001ee02192SEnji Cooper testfmt(" 1.000000E+00", "%13LE", 1.0L); 1011ee02192SEnji Cooper testfmt(" 1.000000", "%13Lf", 1.0L); 1021ee02192SEnji Cooper testfmt(" 1", "%13LG", 1.0L); 1031ee02192SEnji Cooper 1041ee02192SEnji Cooper testfmt("2.718282", "%.*f", -2, 2.7182818); 1051ee02192SEnji Cooper 1061ee02192SEnji Cooper testfmt("1.234568e+06", "%e", 1234567.8); 1071ee02192SEnji Cooper testfmt("1234567.800000", "%f", 1234567.8); 1081ee02192SEnji Cooper testfmt("1.23457E+06", "%G", 1234567.8); 1091ee02192SEnji Cooper testfmt("1.234568e+06", "%Le", 1234567.8L); 1101ee02192SEnji Cooper testfmt("1234567.800000", "%Lf", 1234567.8L); 1111ee02192SEnji Cooper testfmt("1.23457E+06", "%LG", 1234567.8L); 1121ee02192SEnji Cooper 1131ee02192SEnji Cooper #if (LDBL_MANT_DIG > DBL_MANT_DIG) && !defined(__i386__) 1141ee02192SEnji Cooper testfmt("123456789.864210", "%Lf", 123456789.8642097531L); 1151ee02192SEnji Cooper testfmt("-1.23457E+08", "%LG", -123456789.8642097531L); 1161ee02192SEnji Cooper testfmt("123456789.8642097531", "%.10Lf", 123456789.8642097531L); 1171ee02192SEnji Cooper testfmt(" 3.141592653589793238e-4000", "%L27.18Le", 1181ee02192SEnji Cooper 3.14159265358979323846e-4000L); 1191ee02192SEnji Cooper #endif 1201ee02192SEnji Cooper } 1211ee02192SEnji Cooper 1221ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(infinities_and_nans); 1231ee02192SEnji Cooper ATF_TC_BODY(infinities_and_nans, tc) 1241ee02192SEnji Cooper { 1251ee02192SEnji Cooper 1261ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 1271ee02192SEnji Cooper 1281ee02192SEnji Cooper testfmt("nan", "%e", NAN); 1291ee02192SEnji Cooper testfmt("NAN", "%F", NAN); 1301ee02192SEnji Cooper testfmt("nan", "%g", NAN); 1311ee02192SEnji Cooper testfmt("NAN", "%LE", (long double)NAN); 1321ee02192SEnji Cooper testfmt(" nan", "%05e", NAN); 1331ee02192SEnji Cooper 1341ee02192SEnji Cooper testfmt("INF", "%E", HUGE_VAL); 1351ee02192SEnji Cooper testfmt("-inf", "%f", -HUGE_VAL); 1361ee02192SEnji Cooper testfmt("+inf", "%+g", HUGE_VAL); 1371ee02192SEnji Cooper testfmt(" inf", "%4.2Le", HUGE_VALL); 1381ee02192SEnji Cooper testfmt("-inf", "%Lf", -HUGE_VALL); 1391ee02192SEnji Cooper testfmt(" inf", "%05e", HUGE_VAL); 1401ee02192SEnji Cooper testfmt(" -inf", "%05e", -HUGE_VAL); 1411ee02192SEnji Cooper } 1421ee02192SEnji Cooper 1431ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(padding); 1441ee02192SEnji Cooper ATF_TC_BODY(padding, tc) 1451ee02192SEnji Cooper { 1461ee02192SEnji Cooper 1471ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 1481ee02192SEnji Cooper 1491ee02192SEnji Cooper testfmt("0.000000e+00", "%e", 0.0); 1501ee02192SEnji Cooper testfmt("0.000000", "%F", (double)0.0); 1511ee02192SEnji Cooper testfmt("0", "%G", 0.0); 1521ee02192SEnji Cooper testfmt(" 0", "%3.0Lg", 0.0L); 1531ee02192SEnji Cooper testfmt(" 0", "%5.0f", 0.001); 1541ee02192SEnji Cooper } 1551ee02192SEnji Cooper 1561ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(precision_specifiers); 1571ee02192SEnji Cooper ATF_TC_BODY(precision_specifiers, tc) 1581ee02192SEnji Cooper { 1591ee02192SEnji Cooper 1601ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 1611ee02192SEnji Cooper 1621ee02192SEnji Cooper testfmt("1.0123e+00", "%.4e", 1.0123456789); 1631ee02192SEnji Cooper testfmt("1.0123", "%.4f", 1.0123456789); 1641ee02192SEnji Cooper testfmt("1.012", "%.4g", 1.0123456789); 1651ee02192SEnji Cooper testfmt("1.2346e-02", "%.4e", 0.0123456789); 1661ee02192SEnji Cooper testfmt("0.0123", "%.4f", 0.0123456789); 1671ee02192SEnji Cooper testfmt("0.01235", "%.4g", 0.0123456789); 1681ee02192SEnji Cooper } 1691ee02192SEnji Cooper 1701ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(thousands_separator_and_other_locale_tests); 1711ee02192SEnji Cooper ATF_TC_BODY(thousands_separator_and_other_locale_tests, tc) 1721ee02192SEnji Cooper { 1731ee02192SEnji Cooper 1741ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 1751ee02192SEnji Cooper 1761ee02192SEnji Cooper testfmt("12345678.0625", "%'.04f", 12345678.0625); 1771ee02192SEnji Cooper testfmt("0012345678.0625", "%'015.4F", 12345678.0625); 1781ee02192SEnji Cooper 1791ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "hi_IN.ISCII-DEV")); /* grouping == 2;3 */ 180252f1a84SEnji Cooper testfmt("1,23,45,678.0625", "%'.4f", 12345678.0625); 181252f1a84SEnji Cooper testfmt("01,23,45,678.0625", "%'017.4F", 12345678.0625); 182252f1a84SEnji Cooper testfmt(" 9,000", "%'6.0f", 9000.0); 183252f1a84SEnji Cooper testfmt("9,000.0", "%'.1f", 9000.0); 1841ee02192SEnji Cooper 1851ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "ru_RU.ISO8859-5")); /* decimalpoint==, */ 1861ee02192SEnji Cooper testfmt("3,1415", "%g", 3.1415); 1871ee02192SEnji Cooper 1881ee02192SEnji Cooper /* thousands=. decimalpoint=, grouping=3;3 */ 1891ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "el_GR.ISO8859-7")); /* decimalpoint==, */ 1901ee02192SEnji Cooper testfmt("1.234,00", "%'.2f", 1234.00); 1911ee02192SEnji Cooper testfmt("123.456,789", "%'.3f", 123456.789); 1921ee02192SEnji Cooper 1931ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 1941ee02192SEnji Cooper testfmt("12345678.062500", "%'f", 12345678.0625); 1951ee02192SEnji Cooper testfmt("9000.000000", "%'f", 9000.0); 1961ee02192SEnji Cooper } 1971ee02192SEnji Cooper 1981ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(signed_conversions); 1991ee02192SEnji Cooper ATF_TC_BODY(signed_conversions, tc) 2001ee02192SEnji Cooper { 2011ee02192SEnji Cooper 2021ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 2031ee02192SEnji Cooper 2041ee02192SEnji Cooper testfmt("+2.500000e-01", "%+e", 0.25); 2051ee02192SEnji Cooper testfmt("+0.000000", "%+F", 0.0); 2061ee02192SEnji Cooper testfmt("-1", "%+g", -1.0); 2071ee02192SEnji Cooper 2081ee02192SEnji Cooper testfmt("-1.000000e+00", "% e", -1.0); 2091ee02192SEnji Cooper testfmt("+1.000000", "% +f", 1.0); 2101ee02192SEnji Cooper testfmt(" 1", "% g", 1.0); 2111ee02192SEnji Cooper testfmt(" 0", "% g", 0.0); 2121ee02192SEnji Cooper } 2131ee02192SEnji Cooper 2141ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(alternate_form); 2151ee02192SEnji Cooper ATF_TC_BODY(alternate_form, tc) 2161ee02192SEnji Cooper { 2171ee02192SEnji Cooper 2181ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 2191ee02192SEnji Cooper 2201ee02192SEnji Cooper testfmt("1.250e+00", "%#.3e", 1.25); 2211ee02192SEnji Cooper testfmt("123.000000", "%#f", 123.0); 2221ee02192SEnji Cooper testfmt(" 12345.", "%#7.5g", 12345.0); 2231ee02192SEnji Cooper testfmt(" 1.00000", "%#8g", 1.0); 2241ee02192SEnji Cooper testfmt("0.0", "%#.2g", 0.0); 2251ee02192SEnji Cooper } 2261ee02192SEnji Cooper 2271ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(padding_and_decimal_point_placement); 2281ee02192SEnji Cooper ATF_TC_BODY(padding_and_decimal_point_placement, tc) 2291ee02192SEnji Cooper { 2301ee02192SEnji Cooper 2311ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 2321ee02192SEnji Cooper 2331ee02192SEnji Cooper testfmt("03.2E+00", "%08.1E", 3.25); 2341ee02192SEnji Cooper testfmt("003.25", "%06.2F", 3.25); 2351ee02192SEnji Cooper testfmt("0003.25", "%07.4G", 3.25); 2361ee02192SEnji Cooper 2371ee02192SEnji Cooper testfmt("3.14159e-05", "%g", 3.14159e-5); 2381ee02192SEnji Cooper testfmt("0.000314159", "%g", 3.14159e-4); 2391ee02192SEnji Cooper testfmt("3.14159e+06", "%g", 3.14159e6); 2401ee02192SEnji Cooper testfmt("314159", "%g", 3.14159e5); 2411ee02192SEnji Cooper testfmt("314159.", "%#g", 3.14159e5); 2421ee02192SEnji Cooper 2431ee02192SEnji Cooper testfmt(" 9.000000e+03", "%13e", 9000.0); 2441ee02192SEnji Cooper testfmt(" 9000.000000", "%12f", 9000.0); 2451ee02192SEnji Cooper testfmt(" 9000", "%5g", 9000.0); 2461ee02192SEnji Cooper testfmt(" 900000.", "%#8g", 900000.0); 2471ee02192SEnji Cooper testfmt(" 9e+06", "%6g", 9000000.0); 2481ee02192SEnji Cooper testfmt(" 9.000000e-04", "%13e", 0.0009); 2491ee02192SEnji Cooper testfmt(" 0.000900", "%9f", 0.0009); 2501ee02192SEnji Cooper testfmt(" 0.0009", "%7g", 0.0009); 2511ee02192SEnji Cooper testfmt(" 9e-05", "%6g", 0.00009); 2521ee02192SEnji Cooper testfmt(" 9.00000e-05", "%#12g", 0.00009); 2531ee02192SEnji Cooper testfmt(" 9.e-05", "%#7.1g", 0.00009); 2541ee02192SEnji Cooper 2551ee02192SEnji Cooper testfmt(" 0.0", "%4.1f", 0.0); 2561ee02192SEnji Cooper testfmt("90.0", "%4.1f", 90.0); 2571ee02192SEnji Cooper testfmt(" 100", "%4.0f", 100.0); 2581ee02192SEnji Cooper testfmt("9.0e+01", "%4.1e", 90.0); 2591ee02192SEnji Cooper testfmt("1e+02", "%4.0e", 100.0); 2601ee02192SEnji Cooper } 2611ee02192SEnji Cooper 2621ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(decimal_rounding); 2631ee02192SEnji Cooper ATF_TC_BODY(decimal_rounding, tc) 2641ee02192SEnji Cooper { 2651ee02192SEnji Cooper 2661ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 2671ee02192SEnji Cooper 2681ee02192SEnji Cooper fesetround(FE_DOWNWARD); 2691ee02192SEnji Cooper testfmt("4.437", "%.3f", 4.4375); 2701ee02192SEnji Cooper testfmt("-4.438", "%.3f", -4.4375); 2711ee02192SEnji Cooper testfmt("4.437", "%.3Lf", 4.4375L); 2721ee02192SEnji Cooper testfmt("-4.438", "%.3Lf", -4.4375L); 2731ee02192SEnji Cooper 2741ee02192SEnji Cooper fesetround(FE_UPWARD); 2751ee02192SEnji Cooper testfmt("4.438", "%.3f", 4.4375); 2761ee02192SEnji Cooper testfmt("-4.437", "%.3f", -4.4375); 2771ee02192SEnji Cooper testfmt("4.438", "%.3Lf", 4.4375L); 2781ee02192SEnji Cooper testfmt("-4.437", "%.3Lf", -4.4375L); 2791ee02192SEnji Cooper 2801ee02192SEnji Cooper fesetround(FE_TOWARDZERO); 2811ee02192SEnji Cooper testfmt("4.437", "%.3f", 4.4375); 2821ee02192SEnji Cooper testfmt("-4.437", "%.3f", -4.4375); 2831ee02192SEnji Cooper testfmt("4.437", "%.3Lf", 4.4375L); 2841ee02192SEnji Cooper testfmt("-4.437", "%.3Lf", -4.4375L); 2851ee02192SEnji Cooper 2861ee02192SEnji Cooper fesetround(FE_TONEAREST); 2871ee02192SEnji Cooper testfmt("4.438", "%.3f", 4.4375); 2881ee02192SEnji Cooper testfmt("-4.438", "%.3f", -4.4375); 2891ee02192SEnji Cooper testfmt("4.438", "%.3Lf", 4.4375L); 2901ee02192SEnji Cooper testfmt("-4.438", "%.3Lf", -4.4375L); 2911ee02192SEnji Cooper } 2921ee02192SEnji Cooper 2931ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(hexadecimal_floating_point); 2941ee02192SEnji Cooper ATF_TC_BODY(hexadecimal_floating_point, tc) 2951ee02192SEnji Cooper { 2961ee02192SEnji Cooper 2971ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 2981ee02192SEnji Cooper 2991ee02192SEnji Cooper /* 3001ee02192SEnji Cooper * Hexadecimal floating point (%a, %A) tests. Some of these 3011ee02192SEnji Cooper * are only valid if the implementation converts to hex digits 3021ee02192SEnji Cooper * on nibble boundaries. 3031ee02192SEnji Cooper */ 3041ee02192SEnji Cooper testfmt("0x0p+0", "%a", 0x0.0p0); 3051ee02192SEnji Cooper testfmt("0X0.P+0", "%#LA", 0x0.0p0L); 3061ee02192SEnji Cooper testfmt("inf", "%La", (long double)INFINITY); 3071ee02192SEnji Cooper testfmt("+INF", "%+A", INFINITY); 3081ee02192SEnji Cooper testfmt("nan", "%La", (long double)NAN); 3091ee02192SEnji Cooper testfmt("NAN", "%A", NAN); 3101ee02192SEnji Cooper 3111ee02192SEnji Cooper testfmt(" 0x1.23p+0", "%10a", 0x1.23p0); 3121ee02192SEnji Cooper testfmt(" 0x1.23p-500", "%12a", 0x1.23p-500); 3131ee02192SEnji Cooper testfmt(" 0x1.2p+40", "%10.1a", 0x1.23p40); 3141ee02192SEnji Cooper testfmt(" 0X1.230000000000000000000000P-4", "%32.24A", 0x1.23p-4); 3151ee02192SEnji Cooper testfmt("0x1p-1074", "%a", 0x1p-1074); 3161ee02192SEnji Cooper testfmt("0x1.2345p-1024", "%a", 0x1.2345p-1024); 3171ee02192SEnji Cooper 3180653d1fbSEnji Cooper #if (LDBL_MANT_DIG == 64) 3191ee02192SEnji Cooper testfmt("0x1.921fb54442d18468p+1", "%La", 0x3.243f6a8885a308dp0L); 3201ee02192SEnji Cooper testfmt("0x1p-16445", "%La", 0x1p-16445L); 3211ee02192SEnji Cooper testfmt("0x1.30ecap-16381", "%La", 0x9.8765p-16384L); 3221ee02192SEnji Cooper #elif (LDBL_MANT_DIG == 113) 3231ee02192SEnji Cooper testfmt("0x1.921fb54442d18469898cc51701b8p+1", "%La", 3241ee02192SEnji Cooper 0x3.243f6a8885a308d313198a2e037p0L); 3251ee02192SEnji Cooper testfmt("0x1p-16494", "%La", 0x1p-16494L); 3261ee02192SEnji Cooper testfmt("0x1.2345p-16384", "%La", 0x1.2345p-16384L); 3271ee02192SEnji Cooper #else 3281ee02192SEnji Cooper testfmt("0x1.921fb54442d18p+1", "%La", 0x3.243f6a8885a31p0L); 3291ee02192SEnji Cooper testfmt("0x1p-1074", "%La", 0x1p-1074L); 3301ee02192SEnji Cooper testfmt("0x1.30ecap-1021", "%La", 0x9.8765p-1024L); 3311ee02192SEnji Cooper #endif 3321ee02192SEnji Cooper } 3331ee02192SEnji Cooper 3341ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(hexadecimal_rounding); 3351ee02192SEnji Cooper ATF_TC_BODY(hexadecimal_rounding, tc) 3361ee02192SEnji Cooper { 3371ee02192SEnji Cooper 3381ee02192SEnji Cooper ATF_REQUIRE(setlocale(LC_NUMERIC, "C")); 3391ee02192SEnji Cooper 3401ee02192SEnji Cooper fesetround(FE_TOWARDZERO); 3411ee02192SEnji Cooper testfmt("0X1.23456789ABCP+0", "%.11A", 0x1.23456789abcdep0); 3421ee02192SEnji Cooper testfmt("-0x1.23456p+0", "%.5a", -0x1.23456789abcdep0); 3431ee02192SEnji Cooper testfmt("0x1.23456p+0", "%.5a", 0x1.23456789abcdep0); 3441ee02192SEnji Cooper testfmt("0x1.234567p+0", "%.6a", 0x1.23456789abcdep0); 3451ee02192SEnji Cooper testfmt("-0x1.234566p+0", "%.6a", -0x1.23456689abcdep0); 3461ee02192SEnji Cooper 3471ee02192SEnji Cooper fesetround(FE_DOWNWARD); 3481ee02192SEnji Cooper testfmt("0X1.23456789ABCP+0", "%.11A", 0x1.23456789abcdep0); 3491ee02192SEnji Cooper testfmt("-0x1.23457p+0", "%.5a", -0x1.23456789abcdep0); 3501ee02192SEnji Cooper testfmt("0x1.23456p+0", "%.5a", 0x1.23456789abcdep0); 3511ee02192SEnji Cooper testfmt("0x1.234567p+0", "%.6a", 0x1.23456789abcdep0); 3521ee02192SEnji Cooper testfmt("-0x1.234567p+0", "%.6a", -0x1.23456689abcdep0); 3531ee02192SEnji Cooper 3541ee02192SEnji Cooper fesetround(FE_UPWARD); 3551ee02192SEnji Cooper testfmt("0X1.23456789ABDP+0", "%.11A", 0x1.23456789abcdep0); 3561ee02192SEnji Cooper testfmt("-0x1.23456p+0", "%.5a", -0x1.23456789abcdep0); 3571ee02192SEnji Cooper testfmt("0x1.23457p+0", "%.5a", 0x1.23456789abcdep0); 3581ee02192SEnji Cooper testfmt("0x1.234568p+0", "%.6a", 0x1.23456789abcdep0); 3591ee02192SEnji Cooper testfmt("-0x1.234566p+0", "%.6a", -0x1.23456689abcdep0); 3601ee02192SEnji Cooper 3611ee02192SEnji Cooper fesetround(FE_TONEAREST); 3621ee02192SEnji Cooper testfmt("0x1.23456789abcdep+4", "%a", 0x1.23456789abcdep4); 3631ee02192SEnji Cooper testfmt("0X1.23456789ABDP+0", "%.11A", 0x1.23456789abcdep0); 3641ee02192SEnji Cooper testfmt("-0x1.23456p+0", "%.5a", -0x1.23456789abcdep0); 3651ee02192SEnji Cooper testfmt("0x1.23456p+0", "%.5a", 0x1.23456789abcdep0); 3661ee02192SEnji Cooper testfmt("0x1.234568p+0", "%.6a", 0x1.23456789abcdep0); 3671ee02192SEnji Cooper testfmt("-0x1.234567p+0", "%.6a", -0x1.23456689abcdep0); 3681ee02192SEnji Cooper testfmt("0x1.00p-1029", "%.2a", 0x1.fffp-1030); 3691ee02192SEnji Cooper testfmt("0x1.00p-1026", "%.2a", 0xf.fffp-1030); 3701ee02192SEnji Cooper testfmt("0x1.83p+0", "%.2a", 1.51); 3711ee02192SEnji Cooper } 3721ee02192SEnji Cooper 373*0e4ff0acSAlex Richardson ATF_TC_WITHOUT_HEAD(subnormal_double); 374*0e4ff0acSAlex Richardson ATF_TC_BODY(subnormal_double, tc) 375*0e4ff0acSAlex Richardson { 376*0e4ff0acSAlex Richardson /* Regression test for https://bugs.freebsd.org/253847 */ 377*0e4ff0acSAlex Richardson double positive = __DBL_DENORM_MIN__; 378*0e4ff0acSAlex Richardson testfmt("4.9406564584124654418e-324", "%20.20g", positive); 379*0e4ff0acSAlex Richardson testfmt("4.9406564584124654418E-324", "%20.20G", positive); 380*0e4ff0acSAlex Richardson testfmt("0x1p-1074", "%a", positive); 381*0e4ff0acSAlex Richardson testfmt("0X1P-1074", "%A", positive); 382*0e4ff0acSAlex Richardson double negative = -__DBL_DENORM_MIN__; 383*0e4ff0acSAlex Richardson testfmt("-4.9406564584124654418e-324", "%20.20g", negative); 384*0e4ff0acSAlex Richardson testfmt("-4.9406564584124654418E-324", "%20.20G", negative); 385*0e4ff0acSAlex Richardson testfmt("-0x1p-1074", "%a", negative); 386*0e4ff0acSAlex Richardson testfmt("-0X1P-1074", "%A", negative); 387*0e4ff0acSAlex Richardson } 388*0e4ff0acSAlex Richardson 389*0e4ff0acSAlex Richardson ATF_TC_WITHOUT_HEAD(subnormal_float); 390*0e4ff0acSAlex Richardson ATF_TC_BODY(subnormal_float, tc) 391*0e4ff0acSAlex Richardson { 392*0e4ff0acSAlex Richardson float positive = __FLT_DENORM_MIN__; 393*0e4ff0acSAlex Richardson testfmt("1.4012984643248170709e-45", "%20.20g", positive); 394*0e4ff0acSAlex Richardson testfmt("1.4012984643248170709E-45", "%20.20G", positive); 395*0e4ff0acSAlex Richardson testfmt("0x1p-149", "%a", positive); 396*0e4ff0acSAlex Richardson testfmt("0X1P-149", "%A", positive); 397*0e4ff0acSAlex Richardson float negative = -__FLT_DENORM_MIN__; 398*0e4ff0acSAlex Richardson testfmt("-1.4012984643248170709e-45", "%20.20g", negative); 399*0e4ff0acSAlex Richardson testfmt("-1.4012984643248170709E-45", "%20.20G", negative); 400*0e4ff0acSAlex Richardson testfmt("-0x1p-149", "%a", negative); 401*0e4ff0acSAlex Richardson testfmt("-0X1P-149", "%A", negative); 402*0e4ff0acSAlex Richardson } 403*0e4ff0acSAlex Richardson 4041ee02192SEnji Cooper ATF_TP_ADD_TCS(tp) 4051ee02192SEnji Cooper { 4061ee02192SEnji Cooper 4071ee02192SEnji Cooper ATF_TP_ADD_TC(tp, float_within_limits); 4081ee02192SEnji Cooper ATF_TP_ADD_TC(tp, infinities_and_nans); 4091ee02192SEnji Cooper ATF_TP_ADD_TC(tp, padding); 4101ee02192SEnji Cooper ATF_TP_ADD_TC(tp, precision_specifiers); 4111ee02192SEnji Cooper ATF_TP_ADD_TC(tp, thousands_separator_and_other_locale_tests); 4121ee02192SEnji Cooper ATF_TP_ADD_TC(tp, signed_conversions); 4131ee02192SEnji Cooper ATF_TP_ADD_TC(tp, alternate_form); 4141ee02192SEnji Cooper ATF_TP_ADD_TC(tp, padding_and_decimal_point_placement); 4151ee02192SEnji Cooper ATF_TP_ADD_TC(tp, decimal_rounding); 4161ee02192SEnji Cooper ATF_TP_ADD_TC(tp, hexadecimal_floating_point); 4171ee02192SEnji Cooper ATF_TP_ADD_TC(tp, hexadecimal_rounding); 418*0e4ff0acSAlex Richardson ATF_TP_ADD_TC(tp, subnormal_double); 419*0e4ff0acSAlex Richardson ATF_TP_ADD_TC(tp, subnormal_float); 4201ee02192SEnji Cooper 4211ee02192SEnji Cooper return (atf_no_error()); 4221ee02192SEnji Cooper } 423