|
62 | 62 | .str()
|
63 | 63 | #define fHexAndDec(v) \
|
64 | 64 | (std::ostringstream{} << std::hexfloat << (v) << " (" << std::defaultfloat \
|
65 |
| - << (v) << ")") \ |
| 65 | + << std::setprecision(DBL_MAX_10_EXP + 1) << (v) \ |
| 66 | + << ")") \ |
66 | 67 | .str()
|
67 | 68 |
|
68 | 69 | char const *round_name(int d) {
|
@@ -1482,6 +1483,11 @@ TEST_CASE("float.inf") {
|
1482 | 1483 | }
|
1483 | 1484 |
|
1484 | 1485 | TEST_CASE("float.general") {
|
| 1486 | + // max |
| 1487 | + verify("340282346638528859811704183484516925440", 0x1.fffffep+127f); |
| 1488 | + // -max |
| 1489 | + verify("-340282346638528859811704183484516925440", -0x1.fffffep+127f); |
| 1490 | + |
1485 | 1491 | verify("-1e-999", -0.0f, std::errc::result_out_of_range);
|
1486 | 1492 | verify("1."
|
1487 | 1493 | "175494140627517859246175898662808184331245864732796240031385942718174"
|
@@ -1727,3 +1733,328 @@ TEST_CASE("float.decimal_point") {
|
1727 | 1733 | "96875",
|
1728 | 1734 | 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875f);
|
1729 | 1735 | }
|
| 1736 | + |
| 1737 | +#ifdef __STDCPP_FLOAT16_T__ |
| 1738 | +TEST_CASE("float16.inf") { |
| 1739 | + verify("INF", std::numeric_limits<std::float16_t>::infinity()); |
| 1740 | + verify("-INF", -std::numeric_limits<std::float16_t>::infinity()); |
| 1741 | + verify("INFINITY", std::numeric_limits<std::float16_t>::infinity()); |
| 1742 | + verify("-INFINITY", -std::numeric_limits<std::float16_t>::infinity()); |
| 1743 | + verify("infinity", std::numeric_limits<std::float16_t>::infinity()); |
| 1744 | + verify("-infinity", -std::numeric_limits<std::float16_t>::infinity()); |
| 1745 | + verify("inf", std::numeric_limits<std::float16_t>::infinity()); |
| 1746 | + verify("-inf", -std::numeric_limits<std::float16_t>::infinity()); |
| 1747 | + verify("1234456789012345678901234567890e9999999999999999999999999999", |
| 1748 | + std::numeric_limits<std::float16_t>::infinity(), |
| 1749 | + std::errc::result_out_of_range); |
| 1750 | + verify("2e3000", std::numeric_limits<std::float16_t>::infinity(), |
| 1751 | + std::errc::result_out_of_range); |
| 1752 | + verify("3.5028234666e38", std::numeric_limits<std::float16_t>::infinity(), |
| 1753 | + std::errc::result_out_of_range); |
| 1754 | +} |
| 1755 | + |
| 1756 | +TEST_CASE("float16.general") { |
| 1757 | + // max |
| 1758 | + verify("65504", 0x1.ffcp+15f16); |
| 1759 | + // -max |
| 1760 | + verify("-65504", -0x1.ffcp+15f16); |
| 1761 | + // min |
| 1762 | + verify("0.000060975551605224609375", 0x1.ff8p-15f16); |
| 1763 | + verify("6.0975551605224609375e-5", 0x1.ff8p-15f16); |
| 1764 | + // denorm_min |
| 1765 | + verify("0.000000059604644775390625", 0x1p-24f16); |
| 1766 | + verify("5.9604644775390625e-8", 0x1p-24f16); |
| 1767 | + // -min |
| 1768 | + verify("-0.000060975551605224609375", -0x1.ff8p-15f16); |
| 1769 | + verify("-6.0975551605224609375e-5", -0x1.ff8p-15f16); |
| 1770 | + // -denorm_min |
| 1771 | + verify("-0.000000059604644775390625", -0x1p-24f16); |
| 1772 | + verify("-5.9604644775390625e-8", -0x1p-24f16); |
| 1773 | + |
| 1774 | + verify("-1e-999", -0.0f16, std::errc::result_out_of_range); |
| 1775 | + verify("6.0975551605224609375", 0x1.864p+2f16); |
| 1776 | + verify_runtime(append_zeros("6.0975551605224609375", 655), 0x1.864p+2f16); |
| 1777 | + verify_runtime(append_zeros("6.0975551605224609375", 656), 0x1.864p+2f16); |
| 1778 | + verify_runtime(append_zeros("6.0975551605224609375", 1000), 0x1.864p+2f16); |
| 1779 | + verify_runtime(append_zeros("6.0975551605224609375", 655) + |
| 1780 | + std::string("e-5"), |
| 1781 | + 0x1.ff8p-15f16); |
| 1782 | + verify_runtime(append_zeros("6.0975551605224609375", 656) + |
| 1783 | + std::string("e-5"), |
| 1784 | + 0x1.ff8p-15f16); |
| 1785 | + verify_runtime(append_zeros("6.0975551605224609375", 1000) + |
| 1786 | + std::string("e-5"), |
| 1787 | + 0x1.ff8p-15f16); |
| 1788 | + verify("-0", -0.0f16); |
| 1789 | + // verify("1090544144181609348835077142190", 0x1.b877ap+99f16); |
| 1790 | + // verify("1.1754943508e-38", 1.1754943508e-38f16); |
| 1791 | + verify("30219.0830078125", 30219.0830078125f16); |
| 1792 | + verify("17419.6494140625", 17419.6494140625f16); |
| 1793 | + verify("15498.36376953125", 15498.36376953125f16); |
| 1794 | + verify("6318.580322265625", 6318.580322265625f16); |
| 1795 | + verify("2525.2840576171875", 2525.2840576171875f16); |
| 1796 | + verify("1370.9265747070312", 1370.9265747070312f16); |
| 1797 | + verify("936.3702087402344", 936.3702087402344f16); |
| 1798 | + verify("411.88682556152344", 411.88682556152344f16); |
| 1799 | + verify("206.50310516357422", 206.50310516357422f16); |
| 1800 | + verify("124.16878890991211", 124.16878890991211f16); |
| 1801 | + verify("50.811574935913086", 50.811574935913086f16); |
| 1802 | + verify("17.486443519592285", 17.486443519592285f16); |
| 1803 | + verify("13.91745138168335", 13.91745138168335f16); |
| 1804 | + verify("7.5464513301849365", 0x1.e2f90ep+2f16); |
| 1805 | + verify("2.687217116355896", 2.687217116355896f16); |
| 1806 | + verify("1.1877630352973938", 0x1.30113ep+0f16); |
| 1807 | + verify("0.7622503340244293", 0.7622503340244293f16); |
| 1808 | + verify("0.30531780421733856", 0x1.38a53ap-2f16); |
| 1809 | + verify("0.21791061013936996", 0x1.be47eap-3f16); |
| 1810 | + verify("0.09289376810193062", 0x1.7c7e2ep-4f16); |
| 1811 | + verify("0.03706067614257336", 0.03706067614257336f16); |
| 1812 | + verify("0.028068351559340954", 0.028068351559340954f16); |
| 1813 | + verify("0.012114629615098238", 0x1.8cf8e2p-7f16); |
| 1814 | + verify("0.004221370676532388", 0x1.14a6dap-8f16); |
| 1815 | + verify("0.002153817447833717", 0.002153817447833717f16); |
| 1816 | + verify("0.0015924838953651488", 0x1.a175cap-10f16); |
| 1817 | + verify("0.0008602388261351734", 0.0008602388261351734f16); |
| 1818 | + verify("0.00036393293703440577", 0x1.7d9c82p-12f16); |
| 1819 | + verify("0.00013746770127909258", 0.00013746770127909258f16); |
| 1820 | + verify("16407.9462890625", 16407.9462890625f16); |
| 1821 | + // verify("1.1754947011469036e-38", 0x1.000006p-126f16); |
| 1822 | + // verify("7.0064923216240854e-46", 0x1p-149f16); |
| 1823 | + // verify("8388614.5", 8388614.5f16); |
| 1824 | + verify("0e9999999999999999999999999999", 0.f16); |
| 1825 | + // verify( |
| 1826 | + // "4.7019774032891500318749461488889827112746622270883500860350068251e-38", |
| 1827 | + // 4.7019774032891500318749461488889827112746622270883500860350068251e-38f16); |
| 1828 | + verify( |
| 1829 | + "3." |
| 1830 | + "141592653589793238462643383279502884197169399375105820974944592307816406" |
| 1831 | + "2862089986280348253421170679", |
| 1832 | + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679f16); |
| 1833 | + // verify( |
| 1834 | + // "2.3509887016445750159374730744444913556373311135441750430175034126e-38", |
| 1835 | + // 2.3509887016445750159374730744444913556373311135441750430175034126e-38f16); |
| 1836 | + verify("1", 1.f16); |
| 1837 | + // verify("7.0060e-46", 0.f16, std::errc::result_out_of_range); |
| 1838 | + // verify("3.4028234664e38", 0x1.fffffep+127f16); |
| 1839 | + // verify("3.4028234665e38", 0x1.fffffep+127f16); |
| 1840 | + // verify("3.4028234666e38", 0x1.fffffep+127f16); |
| 1841 | + // verify( |
| 1842 | + // "0." |
| 1843 | + // "000000000000000000000000000000000000011754943508222875079687365372222456" |
| 1844 | + // "778186655567720875215087517062784172594547271728515625", |
| 1845 | + // 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625f16); |
| 1846 | + // verify( |
| 1847 | + // "0." |
| 1848 | + // "000000000000000000000000000000000000000000001401298464324817070923729583" |
| 1849 | + // "289916131280261941876515771757068283889791082685860601486638188362121582" |
| 1850 | + // "03125", |
| 1851 | + // 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125f16); |
| 1852 | + // verify( |
| 1853 | + // "0." |
| 1854 | + // "000000000000000000000000000000000000023509885615147285834557659820715330" |
| 1855 | + // "266457179855179808553659262368500061299303460771170648513361811637878417" |
| 1856 | + // "96875", |
| 1857 | + // 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875f16); |
| 1858 | + // verify( |
| 1859 | + // "0." |
| 1860 | + // "000000000000000000000000000000000000011754942106924410754870294448492873" |
| 1861 | + // "488270524287458933338571745305715888704756189042655023513361811637878417" |
| 1862 | + // "96875", |
| 1863 | + // 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875f16); |
| 1864 | +} |
| 1865 | +#endif |
| 1866 | + |
| 1867 | +#ifdef __STDCPP_BFLOAT16_T__ |
| 1868 | +TEST_CASE("bfloat16.inf") { |
| 1869 | + verify("INF", std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1870 | + verify("-INF", -std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1871 | + verify("INFINITY", std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1872 | + verify("-INFINITY", -std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1873 | + verify("infinity", std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1874 | + verify("-infinity", -std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1875 | + verify("inf", std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1876 | + verify("-inf", -std::numeric_limits<std::bfloat16_t>::infinity()); |
| 1877 | + verify("1234456789012345678901234567890e9999999999999999999999999999", |
| 1878 | + std::numeric_limits<std::bfloat16_t>::infinity(), |
| 1879 | + std::errc::result_out_of_range); |
| 1880 | + verify("2e3000", std::numeric_limits<std::bfloat16_t>::infinity(), |
| 1881 | + std::errc::result_out_of_range); |
| 1882 | + verify("3.5028234666e38", std::numeric_limits<std::bfloat16_t>::infinity(), |
| 1883 | + std::errc::result_out_of_range); |
| 1884 | +} |
| 1885 | + |
| 1886 | +TEST_CASE("bfloat16.general") { |
| 1887 | + // max |
| 1888 | + verify("338953138925153547590470800371487866880", 0x1.fep+127bf16); |
| 1889 | + // -max |
| 1890 | + verify("-338953138925153547590470800371487866880", -0x1.fep+127bf16); |
| 1891 | + // min |
| 1892 | + verify( |
| 1893 | + "0." |
| 1894 | + "000000000000000000000000000000000000011754943508222875079687365372222456" |
| 1895 | + "778186655567720875215087517062784172594547271728515625", |
| 1896 | + 0x1p-126bf16); |
| 1897 | + verify("1." |
| 1898 | + "175494350822287507968736537222245677818665556772087521508751706278417" |
| 1899 | + "2594" |
| 1900 | + "547271728515625e-38", |
| 1901 | + 0x1p-126bf16); |
| 1902 | + // denorm_min |
| 1903 | + verify("0." |
| 1904 | + "000000000000000000000000000000000000000091835496157991211560057541970" |
| 1905 | + "4879" |
| 1906 | + "435795832466228193376178712270530013483949005603790283203125", |
| 1907 | + 0x1p-133bf16); |
| 1908 | + verify("9." |
| 1909 | + "183549615799121156005754197048794357958324662281933761787122705300134" |
| 1910 | + "8394" |
| 1911 | + "9005603790283203125e-41", |
| 1912 | + 0x1p-133bf16); |
| 1913 | + // -min |
| 1914 | + verify( |
| 1915 | + "-0." |
| 1916 | + "000000000000000000000000000000000000011754943508222875079687365372222456" |
| 1917 | + "778186655567720875215087517062784172594547271728515625", |
| 1918 | + -0x1p-126bf16); |
| 1919 | + verify( |
| 1920 | + "-1." |
| 1921 | + "175494350822287507968736537222245677818665556772087521508751706278417259" |
| 1922 | + "4547271728515625e-38", |
| 1923 | + -0x1p-126bf16); |
| 1924 | + // -denorm_min |
| 1925 | + verify("-0" |
| 1926 | + ".00000000000000000000000000000000000000009183549615799121156005754197" |
| 1927 | + "0487" |
| 1928 | + "9435795832466228193376178712270530013483949005603790283203125", |
| 1929 | + -0x1p-133bf16); |
| 1930 | + verify("-9" |
| 1931 | + ".18354961579912115600575419704879435795832466228193376178712270530013" |
| 1932 | + "4839" |
| 1933 | + "49005603790283203125e-41", |
| 1934 | + -0x1p-133bf16); |
| 1935 | + |
| 1936 | + verify("-1e-999", -0.0bf16, std::errc::result_out_of_range); |
| 1937 | + verify_runtime( |
| 1938 | + "1." |
| 1939 | + "175494350822287507968736537222245677818665556772087521508751706278417" |
| 1940 | + "2594547271728515625", |
| 1941 | + 0x1.2cp+0bf16); |
| 1942 | + verify_runtime(append_zeros("1." |
| 1943 | + "175494350822287507968736537222245677818665556772" |
| 1944 | + "0875215087517062784172594547271728515625", |
| 1945 | + 655), |
| 1946 | + 0x1.2cp+0bf16); |
| 1947 | + verify_runtime(append_zeros("1." |
| 1948 | + "175494350822287507968736537222245677818665556772" |
| 1949 | + "0875215087517062784172594547271728515625", |
| 1950 | + 656), |
| 1951 | + 0x1.2cp+0bf16); |
| 1952 | + verify_runtime(append_zeros("1." |
| 1953 | + "175494350822287507968736537222245677818665556772" |
| 1954 | + "0875215087517062784172594547271728515625", |
| 1955 | + 1000), |
| 1956 | + 0x1.2cp+0bf16); |
| 1957 | + verify_runtime(append_zeros("1." |
| 1958 | + "175494350822287507968736537222245677818665556772" |
| 1959 | + "0875215087517062784172594547271728515625", |
| 1960 | + 655) + |
| 1961 | + std::string("e-38"), |
| 1962 | + 0x1p-126bf16); |
| 1963 | + verify_runtime(append_zeros("1." |
| 1964 | + "175494350822287507968736537222245677818665556772" |
| 1965 | + "0875215087517062784172594547271728515625", |
| 1966 | + 656) + |
| 1967 | + std::string("e-38"), |
| 1968 | + 0x1p-126bf16); |
| 1969 | + verify_runtime(append_zeros("1." |
| 1970 | + "175494350822287507968736537222245677818665556772" |
| 1971 | + "0875215087517062784172594547271728515625", |
| 1972 | + 1000) + |
| 1973 | + std::string("e-38"), |
| 1974 | + 0x1p-126bf16); |
| 1975 | + verify("-0", -0.0bf16); |
| 1976 | + // verify("1090544144181609348835077142190", 0x1.b877ap+99bf16); |
| 1977 | + // verify("1.1754943508e-38", 1.1754943508e-38bf16); |
| 1978 | + verify("30219.0830078125", 30219.0830078125bf16); |
| 1979 | + verify("16252921.5", 16252921.5bf16); |
| 1980 | + verify("5322519.25", 5322519.25bf16); |
| 1981 | + verify("3900245.875", 3900245.875bf16); |
| 1982 | + verify("1510988.3125", 1510988.3125bf16); |
| 1983 | + verify("782262.28125", 782262.28125bf16); |
| 1984 | + verify("328381.484375", 328381.484375bf16); |
| 1985 | + verify("156782.0703125", 156782.0703125bf16); |
| 1986 | + verify("85003.24609375", 85003.24609375bf16); |
| 1987 | + verify("17419.6494140625", 17419.6494140625bf16); |
| 1988 | + verify("15498.36376953125", 15498.36376953125bf16); |
| 1989 | + verify("6318.580322265625", 6318.580322265625bf16); |
| 1990 | + verify("2525.2840576171875", 2525.2840576171875bf16); |
| 1991 | + verify("1370.9265747070312", 1370.9265747070312bf16); |
| 1992 | + verify("936.3702087402344", 936.3702087402344bf16); |
| 1993 | + verify("411.88682556152344", 411.88682556152344bf16); |
| 1994 | + verify("206.50310516357422", 206.50310516357422bf16); |
| 1995 | + verify("124.16878890991211", 124.16878890991211bf16); |
| 1996 | + verify("50.811574935913086", 50.811574935913086bf16); |
| 1997 | + verify("17.486443519592285", 17.486443519592285bf16); |
| 1998 | + verify("13.91745138168335", 13.91745138168335bf16); |
| 1999 | + verify("7.5464513301849365", 0x1.e2f90ep+2bf16); |
| 2000 | + verify("2.687217116355896", 2.687217116355896bf16); |
| 2001 | + verify("1.1877630352973938", 0x1.30113ep+0bf16); |
| 2002 | + verify("0.7622503340244293", 0.7622503340244293bf16); |
| 2003 | + verify("0.30531780421733856", 0x1.38a53ap-2bf16); |
| 2004 | + verify("0.21791061013936996", 0x1.be47eap-3bf16); |
| 2005 | + verify("0.09289376810193062", 0x1.7c7e2ep-4bf16); |
| 2006 | + verify("0.03706067614257336", 0.03706067614257336bf16); |
| 2007 | + verify("0.028068351559340954", 0.028068351559340954bf16); |
| 2008 | + verify("0.012114629615098238", 0x1.8cf8e2p-7bf16); |
| 2009 | + verify("0.004221370676532388", 0x1.14a6dap-8bf16); |
| 2010 | + verify("0.002153817447833717", 0.002153817447833717bf16); |
| 2011 | + verify("0.0015924838953651488", 0x1.a175cap-10bf16); |
| 2012 | + verify("0.0008602388261351734", 0.0008602388261351734bf16); |
| 2013 | + verify("0.00036393293703440577", 0x1.7d9c82p-12bf16); |
| 2014 | + verify("0.00013746770127909258", 0.00013746770127909258bf16); |
| 2015 | + verify("16407.9462890625", 16407.9462890625bf16); |
| 2016 | + // verify("1.1754947011469036e-38", 0x1.000006p-126bf16); |
| 2017 | + // verify("7.0064923216240854e-46", 0x1p-149bf16); |
| 2018 | + // verify("8388614.5", 8388614.5bf16); |
| 2019 | + verify("0e9999999999999999999999999999", 0.bf16); |
| 2020 | + // verify( |
| 2021 | + // "4.7019774032891500318749461488889827112746622270883500860350068251e-38", |
| 2022 | + // 4.7019774032891500318749461488889827112746622270883500860350068251e-38bf16); |
| 2023 | + verify( |
| 2024 | + "3." |
| 2025 | + "141592653589793238462643383279502884197169399375105820974944592307816406" |
| 2026 | + "2862089986280348253421170679", |
| 2027 | + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679bf16); |
| 2028 | + // verify( |
| 2029 | + // "2.3509887016445750159374730744444913556373311135441750430175034126e-38", |
| 2030 | + // 2.3509887016445750159374730744444913556373311135441750430175034126e-38bf16); |
| 2031 | + verify("1", 1.bf16); |
| 2032 | + verify("7.0060e-46", 0.bf16, std::errc::result_out_of_range); |
| 2033 | + verify("3.388e+38", 0x1.fep+127bf16); |
| 2034 | + verify("3.389e+38", 0x1.fep+127bf16); |
| 2035 | + verify("3.390e+38", 0x1.fep+127bf16); |
| 2036 | + // verify( |
| 2037 | + // "0." |
| 2038 | + // "000000000000000000000000000000000000011754943508222875079687365372222456" |
| 2039 | + // "778186655567720875215087517062784172594547271728515625", |
| 2040 | + // 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625bf16); |
| 2041 | + // verify( |
| 2042 | + // "0." |
| 2043 | + // "000000000000000000000000000000000000000000001401298464324817070923729583" |
| 2044 | + // "289916131280261941876515771757068283889791082685860601486638188362121582" |
| 2045 | + // "03125", |
| 2046 | + // 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125bf16); |
| 2047 | + // verify( |
| 2048 | + // "0." |
| 2049 | + // "000000000000000000000000000000000000023509885615147285834557659820715330" |
| 2050 | + // "266457179855179808553659262368500061299303460771170648513361811637878417" |
| 2051 | + // "96875", |
| 2052 | + // 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875bf16); |
| 2053 | + // verify( |
| 2054 | + // "0." |
| 2055 | + // "000000000000000000000000000000000000011754942106924410754870294448492873" |
| 2056 | + // "488270524287458933338571745305715888704756189042655023513361811637878417" |
| 2057 | + // "96875", |
| 2058 | + // 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875bf16); |
| 2059 | +} |
| 2060 | +#endif |
0 commit comments