Skip to content

Commit ac453a0

Browse files
committed
overly precise tests for imprecise floats
1 parent da819fe commit ac453a0

File tree

1 file changed

+332
-1
lines changed

1 file changed

+332
-1
lines changed

tests/basictest.cpp

Lines changed: 332 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
.str()
6363
#define fHexAndDec(v) \
6464
(std::ostringstream{} << std::hexfloat << (v) << " (" << std::defaultfloat \
65-
<< (v) << ")") \
65+
<< std::setprecision(DBL_MAX_10_EXP + 1) << (v) \
66+
<< ")") \
6667
.str()
6768

6869
char const *round_name(int d) {
@@ -1482,6 +1483,11 @@ TEST_CASE("float.inf") {
14821483
}
14831484

14841485
TEST_CASE("float.general") {
1486+
// max
1487+
verify("340282346638528859811704183484516925440", 0x1.fffffep+127f);
1488+
// -max
1489+
verify("-340282346638528859811704183484516925440", -0x1.fffffep+127f);
1490+
14851491
verify("-1e-999", -0.0f, std::errc::result_out_of_range);
14861492
verify("1."
14871493
"175494140627517859246175898662808184331245864732796240031385942718174"
@@ -1727,3 +1733,328 @@ TEST_CASE("float.decimal_point") {
17271733
"96875",
17281734
0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875f);
17291735
}
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

Comments
 (0)