From ac453a091a66a11035e2f192a449d7313ef0ec87 Mon Sep 17 00:00:00 2001 From: Anders Dalvander Date: Tue, 3 Dec 2024 23:22:36 +0100 Subject: [PATCH] overly precise tests for imprecise floats --- tests/basictest.cpp | 333 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 332 insertions(+), 1 deletion(-) diff --git a/tests/basictest.cpp b/tests/basictest.cpp index 73aa747..2513be5 100644 --- a/tests/basictest.cpp +++ b/tests/basictest.cpp @@ -62,7 +62,8 @@ .str() #define fHexAndDec(v) \ (std::ostringstream{} << std::hexfloat << (v) << " (" << std::defaultfloat \ - << (v) << ")") \ + << std::setprecision(DBL_MAX_10_EXP + 1) << (v) \ + << ")") \ .str() char const *round_name(int d) { @@ -1482,6 +1483,11 @@ TEST_CASE("float.inf") { } TEST_CASE("float.general") { + // max + verify("340282346638528859811704183484516925440", 0x1.fffffep+127f); + // -max + verify("-340282346638528859811704183484516925440", -0x1.fffffep+127f); + verify("-1e-999", -0.0f, std::errc::result_out_of_range); verify("1." "175494140627517859246175898662808184331245864732796240031385942718174" @@ -1727,3 +1733,328 @@ TEST_CASE("float.decimal_point") { "96875", 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875f); } + +#ifdef __STDCPP_FLOAT16_T__ +TEST_CASE("float16.inf") { + verify("INF", std::numeric_limits::infinity()); + verify("-INF", -std::numeric_limits::infinity()); + verify("INFINITY", std::numeric_limits::infinity()); + verify("-INFINITY", -std::numeric_limits::infinity()); + verify("infinity", std::numeric_limits::infinity()); + verify("-infinity", -std::numeric_limits::infinity()); + verify("inf", std::numeric_limits::infinity()); + verify("-inf", -std::numeric_limits::infinity()); + verify("1234456789012345678901234567890e9999999999999999999999999999", + std::numeric_limits::infinity(), + std::errc::result_out_of_range); + verify("2e3000", std::numeric_limits::infinity(), + std::errc::result_out_of_range); + verify("3.5028234666e38", std::numeric_limits::infinity(), + std::errc::result_out_of_range); +} + +TEST_CASE("float16.general") { + // max + verify("65504", 0x1.ffcp+15f16); + // -max + verify("-65504", -0x1.ffcp+15f16); + // min + verify("0.000060975551605224609375", 0x1.ff8p-15f16); + verify("6.0975551605224609375e-5", 0x1.ff8p-15f16); + // denorm_min + verify("0.000000059604644775390625", 0x1p-24f16); + verify("5.9604644775390625e-8", 0x1p-24f16); + // -min + verify("-0.000060975551605224609375", -0x1.ff8p-15f16); + verify("-6.0975551605224609375e-5", -0x1.ff8p-15f16); + // -denorm_min + verify("-0.000000059604644775390625", -0x1p-24f16); + verify("-5.9604644775390625e-8", -0x1p-24f16); + + verify("-1e-999", -0.0f16, std::errc::result_out_of_range); + verify("6.0975551605224609375", 0x1.864p+2f16); + verify_runtime(append_zeros("6.0975551605224609375", 655), 0x1.864p+2f16); + verify_runtime(append_zeros("6.0975551605224609375", 656), 0x1.864p+2f16); + verify_runtime(append_zeros("6.0975551605224609375", 1000), 0x1.864p+2f16); + verify_runtime(append_zeros("6.0975551605224609375", 655) + + std::string("e-5"), + 0x1.ff8p-15f16); + verify_runtime(append_zeros("6.0975551605224609375", 656) + + std::string("e-5"), + 0x1.ff8p-15f16); + verify_runtime(append_zeros("6.0975551605224609375", 1000) + + std::string("e-5"), + 0x1.ff8p-15f16); + verify("-0", -0.0f16); + // verify("1090544144181609348835077142190", 0x1.b877ap+99f16); + // verify("1.1754943508e-38", 1.1754943508e-38f16); + verify("30219.0830078125", 30219.0830078125f16); + verify("17419.6494140625", 17419.6494140625f16); + verify("15498.36376953125", 15498.36376953125f16); + verify("6318.580322265625", 6318.580322265625f16); + verify("2525.2840576171875", 2525.2840576171875f16); + verify("1370.9265747070312", 1370.9265747070312f16); + verify("936.3702087402344", 936.3702087402344f16); + verify("411.88682556152344", 411.88682556152344f16); + verify("206.50310516357422", 206.50310516357422f16); + verify("124.16878890991211", 124.16878890991211f16); + verify("50.811574935913086", 50.811574935913086f16); + verify("17.486443519592285", 17.486443519592285f16); + verify("13.91745138168335", 13.91745138168335f16); + verify("7.5464513301849365", 0x1.e2f90ep+2f16); + verify("2.687217116355896", 2.687217116355896f16); + verify("1.1877630352973938", 0x1.30113ep+0f16); + verify("0.7622503340244293", 0.7622503340244293f16); + verify("0.30531780421733856", 0x1.38a53ap-2f16); + verify("0.21791061013936996", 0x1.be47eap-3f16); + verify("0.09289376810193062", 0x1.7c7e2ep-4f16); + verify("0.03706067614257336", 0.03706067614257336f16); + verify("0.028068351559340954", 0.028068351559340954f16); + verify("0.012114629615098238", 0x1.8cf8e2p-7f16); + verify("0.004221370676532388", 0x1.14a6dap-8f16); + verify("0.002153817447833717", 0.002153817447833717f16); + verify("0.0015924838953651488", 0x1.a175cap-10f16); + verify("0.0008602388261351734", 0.0008602388261351734f16); + verify("0.00036393293703440577", 0x1.7d9c82p-12f16); + verify("0.00013746770127909258", 0.00013746770127909258f16); + verify("16407.9462890625", 16407.9462890625f16); + // verify("1.1754947011469036e-38", 0x1.000006p-126f16); + // verify("7.0064923216240854e-46", 0x1p-149f16); + // verify("8388614.5", 8388614.5f16); + verify("0e9999999999999999999999999999", 0.f16); + // verify( + // "4.7019774032891500318749461488889827112746622270883500860350068251e-38", + // 4.7019774032891500318749461488889827112746622270883500860350068251e-38f16); + verify( + "3." + "141592653589793238462643383279502884197169399375105820974944592307816406" + "2862089986280348253421170679", + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679f16); + // verify( + // "2.3509887016445750159374730744444913556373311135441750430175034126e-38", + // 2.3509887016445750159374730744444913556373311135441750430175034126e-38f16); + verify("1", 1.f16); + // verify("7.0060e-46", 0.f16, std::errc::result_out_of_range); + // verify("3.4028234664e38", 0x1.fffffep+127f16); + // verify("3.4028234665e38", 0x1.fffffep+127f16); + // verify("3.4028234666e38", 0x1.fffffep+127f16); + // verify( + // "0." + // "000000000000000000000000000000000000011754943508222875079687365372222456" + // "778186655567720875215087517062784172594547271728515625", + // 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625f16); + // verify( + // "0." + // "000000000000000000000000000000000000000000001401298464324817070923729583" + // "289916131280261941876515771757068283889791082685860601486638188362121582" + // "03125", + // 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125f16); + // verify( + // "0." + // "000000000000000000000000000000000000023509885615147285834557659820715330" + // "266457179855179808553659262368500061299303460771170648513361811637878417" + // "96875", + // 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875f16); + // verify( + // "0." + // "000000000000000000000000000000000000011754942106924410754870294448492873" + // "488270524287458933338571745305715888704756189042655023513361811637878417" + // "96875", + // 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875f16); +} +#endif + +#ifdef __STDCPP_BFLOAT16_T__ +TEST_CASE("bfloat16.inf") { + verify("INF", std::numeric_limits::infinity()); + verify("-INF", -std::numeric_limits::infinity()); + verify("INFINITY", std::numeric_limits::infinity()); + verify("-INFINITY", -std::numeric_limits::infinity()); + verify("infinity", std::numeric_limits::infinity()); + verify("-infinity", -std::numeric_limits::infinity()); + verify("inf", std::numeric_limits::infinity()); + verify("-inf", -std::numeric_limits::infinity()); + verify("1234456789012345678901234567890e9999999999999999999999999999", + std::numeric_limits::infinity(), + std::errc::result_out_of_range); + verify("2e3000", std::numeric_limits::infinity(), + std::errc::result_out_of_range); + verify("3.5028234666e38", std::numeric_limits::infinity(), + std::errc::result_out_of_range); +} + +TEST_CASE("bfloat16.general") { + // max + verify("338953138925153547590470800371487866880", 0x1.fep+127bf16); + // -max + verify("-338953138925153547590470800371487866880", -0x1.fep+127bf16); + // min + verify( + "0." + "000000000000000000000000000000000000011754943508222875079687365372222456" + "778186655567720875215087517062784172594547271728515625", + 0x1p-126bf16); + verify("1." + "175494350822287507968736537222245677818665556772087521508751706278417" + "2594" + "547271728515625e-38", + 0x1p-126bf16); + // denorm_min + verify("0." + "000000000000000000000000000000000000000091835496157991211560057541970" + "4879" + "435795832466228193376178712270530013483949005603790283203125", + 0x1p-133bf16); + verify("9." + "183549615799121156005754197048794357958324662281933761787122705300134" + "8394" + "9005603790283203125e-41", + 0x1p-133bf16); + // -min + verify( + "-0." + "000000000000000000000000000000000000011754943508222875079687365372222456" + "778186655567720875215087517062784172594547271728515625", + -0x1p-126bf16); + verify( + "-1." + "175494350822287507968736537222245677818665556772087521508751706278417259" + "4547271728515625e-38", + -0x1p-126bf16); + // -denorm_min + verify("-0" + ".00000000000000000000000000000000000000009183549615799121156005754197" + "0487" + "9435795832466228193376178712270530013483949005603790283203125", + -0x1p-133bf16); + verify("-9" + ".18354961579912115600575419704879435795832466228193376178712270530013" + "4839" + "49005603790283203125e-41", + -0x1p-133bf16); + + verify("-1e-999", -0.0bf16, std::errc::result_out_of_range); + verify_runtime( + "1." + "175494350822287507968736537222245677818665556772087521508751706278417" + "2594547271728515625", + 0x1.2cp+0bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 655), + 0x1.2cp+0bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 656), + 0x1.2cp+0bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 1000), + 0x1.2cp+0bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 655) + + std::string("e-38"), + 0x1p-126bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 656) + + std::string("e-38"), + 0x1p-126bf16); + verify_runtime(append_zeros("1." + "175494350822287507968736537222245677818665556772" + "0875215087517062784172594547271728515625", + 1000) + + std::string("e-38"), + 0x1p-126bf16); + verify("-0", -0.0bf16); + // verify("1090544144181609348835077142190", 0x1.b877ap+99bf16); + // verify("1.1754943508e-38", 1.1754943508e-38bf16); + verify("30219.0830078125", 30219.0830078125bf16); + verify("16252921.5", 16252921.5bf16); + verify("5322519.25", 5322519.25bf16); + verify("3900245.875", 3900245.875bf16); + verify("1510988.3125", 1510988.3125bf16); + verify("782262.28125", 782262.28125bf16); + verify("328381.484375", 328381.484375bf16); + verify("156782.0703125", 156782.0703125bf16); + verify("85003.24609375", 85003.24609375bf16); + verify("17419.6494140625", 17419.6494140625bf16); + verify("15498.36376953125", 15498.36376953125bf16); + verify("6318.580322265625", 6318.580322265625bf16); + verify("2525.2840576171875", 2525.2840576171875bf16); + verify("1370.9265747070312", 1370.9265747070312bf16); + verify("936.3702087402344", 936.3702087402344bf16); + verify("411.88682556152344", 411.88682556152344bf16); + verify("206.50310516357422", 206.50310516357422bf16); + verify("124.16878890991211", 124.16878890991211bf16); + verify("50.811574935913086", 50.811574935913086bf16); + verify("17.486443519592285", 17.486443519592285bf16); + verify("13.91745138168335", 13.91745138168335bf16); + verify("7.5464513301849365", 0x1.e2f90ep+2bf16); + verify("2.687217116355896", 2.687217116355896bf16); + verify("1.1877630352973938", 0x1.30113ep+0bf16); + verify("0.7622503340244293", 0.7622503340244293bf16); + verify("0.30531780421733856", 0x1.38a53ap-2bf16); + verify("0.21791061013936996", 0x1.be47eap-3bf16); + verify("0.09289376810193062", 0x1.7c7e2ep-4bf16); + verify("0.03706067614257336", 0.03706067614257336bf16); + verify("0.028068351559340954", 0.028068351559340954bf16); + verify("0.012114629615098238", 0x1.8cf8e2p-7bf16); + verify("0.004221370676532388", 0x1.14a6dap-8bf16); + verify("0.002153817447833717", 0.002153817447833717bf16); + verify("0.0015924838953651488", 0x1.a175cap-10bf16); + verify("0.0008602388261351734", 0.0008602388261351734bf16); + verify("0.00036393293703440577", 0x1.7d9c82p-12bf16); + verify("0.00013746770127909258", 0.00013746770127909258bf16); + verify("16407.9462890625", 16407.9462890625bf16); + // verify("1.1754947011469036e-38", 0x1.000006p-126bf16); + // verify("7.0064923216240854e-46", 0x1p-149bf16); + // verify("8388614.5", 8388614.5bf16); + verify("0e9999999999999999999999999999", 0.bf16); + // verify( + // "4.7019774032891500318749461488889827112746622270883500860350068251e-38", + // 4.7019774032891500318749461488889827112746622270883500860350068251e-38bf16); + verify( + "3." + "141592653589793238462643383279502884197169399375105820974944592307816406" + "2862089986280348253421170679", + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679bf16); + // verify( + // "2.3509887016445750159374730744444913556373311135441750430175034126e-38", + // 2.3509887016445750159374730744444913556373311135441750430175034126e-38bf16); + verify("1", 1.bf16); + verify("7.0060e-46", 0.bf16, std::errc::result_out_of_range); + verify("3.388e+38", 0x1.fep+127bf16); + verify("3.389e+38", 0x1.fep+127bf16); + verify("3.390e+38", 0x1.fep+127bf16); + // verify( + // "0." + // "000000000000000000000000000000000000011754943508222875079687365372222456" + // "778186655567720875215087517062784172594547271728515625", + // 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625bf16); + // verify( + // "0." + // "000000000000000000000000000000000000000000001401298464324817070923729583" + // "289916131280261941876515771757068283889791082685860601486638188362121582" + // "03125", + // 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125bf16); + // verify( + // "0." + // "000000000000000000000000000000000000023509885615147285834557659820715330" + // "266457179855179808553659262368500061299303460771170648513361811637878417" + // "96875", + // 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875bf16); + // verify( + // "0." + // "000000000000000000000000000000000000011754942106924410754870294448492873" + // "488270524287458933338571745305715888704756189042655023513361811637878417" + // "96875", + // 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875bf16); +} +#endif