From 3ccaf1c1bfae6f534a5d03ce0a028989138e92c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 8 Apr 2019 14:20:00 +0300 Subject: [PATCH] crt-test: Add tests of fmod/remainder/remquo --- test/crt-test.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/test/crt-test.c b/test/crt-test.c index c500d59..3db39ed 100644 --- a/test/crt-test.c +++ b/test/crt-test.c @@ -275,6 +275,135 @@ int main(int argc, char* argv[]) { TEST_FLT_NAN(fmal(F(2), F(NAN), F(4))); TEST_FLT_NAN(fmal(F(2), F(3), F(NAN))); + TEST_FLT(fmod(F(3.9), F(4.0)), 3.9); + TEST_FLT_ACCURACY(fmod(F(7.9), F(4.0)), 3.9, 0.001); + TEST_FLT(fmod(F(-3.9), F(4.0)), -3.9); + TEST_FLT(fmod(F(3.9), F(-4.0)), 3.9); + TEST_FLT_ACCURACY(fmod(F(7.9), F(-4.0)), 3.9, 0.001); + TEST_FLT(fmod(F(-3.9), F(-4.0)), -3.9); + TEST_FLT_NAN(fmod(F(INFINITY), F(4.0))); + TEST_FLT_NAN(fmod(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(fmod(F(0), F(NAN))); + + TEST_FLT_ACCURACY(fmodf(F(3.9), F(4.0)), 3.9, 0.001); + TEST_FLT_ACCURACY(fmodf(F(7.9), F(4.0)), 3.9, 0.001); + TEST_FLT_ACCURACY(fmodf(F(-3.9), F(4.0)), -3.9, 0.001); + TEST_FLT_ACCURACY(fmodf(F(3.9), F(-4.0)), 3.9, 0.001); + TEST_FLT_ACCURACY(fmodf(F(7.9), F(-4.0)), 3.9, 0.001); + TEST_FLT_ACCURACY(fmodf(F(-3.9), F(-4.0)), -3.9, 0.001); + TEST_FLT_NAN(fmodf(F(INFINITY), F(4.0))); + TEST_FLT_NAN(fmodf(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(fmodf(F(0), F(NAN))); + +#if !defined(__MINGW32__) || (!defined(__arm__) && !defined(__aarch64__)) + TEST_FLT(fmodl(F(3.9), F(4.0)), 3.9); + TEST_FLT_ACCURACY(fmodl(F(7.9), F(4.0)), 3.9, 0.001); + TEST_FLT(fmodl(F(-3.9), F(4.0)), -3.9); + TEST_FLT(fmodl(F(3.9), F(-4.0)), 3.9); + TEST_FLT_ACCURACY(fmodl(F(7.9), F(-4.0)), 3.9, 0.001); + TEST_FLT(fmodl(F(-3.9), F(-4.0)), -3.9); + TEST_FLT_NAN(fmodl(F(INFINITY), F(4.0))); + TEST_FLT_NAN(fmodl(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(fmodl(F(0), F(NAN))); +#endif + + TEST_FLT(remainder(F(1.9), F(4.0)), 1.9); + TEST_FLT(remainder(F(2.0), F(4.0)), 2.0); + TEST_FLT_ACCURACY(remainder(F(3.9), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainder(F(-2.0), F(4.0)), -2.0, 0.001); + TEST_FLT_ACCURACY(remainder(F(-3.9), F(4.0)), 0.1, 0.001); + TEST_FLT_ACCURACY(remainder(F(-4.1), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainder(F(3.9), F(-4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainder(F(-3.9), F(-4.0)), 0.1, 0.001); + TEST_FLT_NAN(remainder(F(INFINITY), F(4.0))); + TEST_FLT_NAN(remainder(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(remainder(F(0), F(NAN))); + + TEST_FLT_ACCURACY(remainderf(F(1.9), F(4.0)), 1.9, 0.001); + TEST_FLT(remainderf(F(2.0), F(4.0)), 2.0); + TEST_FLT_ACCURACY(remainderf(F(3.9), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderf(F(-2.0), F(4.0)), -2.0, 0.001); + TEST_FLT_ACCURACY(remainderf(F(-3.9), F(4.0)), 0.1, 0.001); + TEST_FLT_ACCURACY(remainderf(F(-4.1), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderf(F(3.9), F(-4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderf(F(-3.9), F(-4.0)), 0.1, 0.001); + TEST_FLT_NAN(remainderf(F(INFINITY), F(4.0))); + TEST_FLT_NAN(remainderf(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(remainderf(F(0), F(NAN))); + + TEST_FLT(remainderl(F(1.9), F(4.0)), 1.9); + TEST_FLT(remainderl(F(2.0), F(4.0)), 2.0); + TEST_FLT_ACCURACY(remainderl(F(3.9), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderl(F(-2.0), F(4.0)), -2.0, 0.001); + TEST_FLT_ACCURACY(remainderl(F(-3.9), F(4.0)), 0.1, 0.001); + TEST_FLT_ACCURACY(remainderl(F(-4.1), F(4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderl(F(3.9), F(-4.0)), -0.1, 0.001); + TEST_FLT_ACCURACY(remainderl(F(-3.9), F(-4.0)), 0.1, 0.001); + TEST_FLT_NAN(remainderl(F(INFINITY), F(4.0))); + TEST_FLT_NAN(remainderl(F(-INFINITY), F(4.0))); + TEST_FLT_NAN(remainderl(F(0), F(NAN))); + + int quo = 42; + TEST_FLT(remquo(F(1.9), F(4.0), &quo), 1.9); + TEST_INT(quo, 0); + TEST_FLT(remquo(F(2.0), F(4.0), &quo), 2.0); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquo(F(3.9), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_ACCURACY(remquo(F(-2.0), F(4.0), &quo), -2.0, 0.001); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquo(F(-3.9), F(4.0), &quo), 0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquo(F(-4.1), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquo(F(3.9), F(-4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquo(F(-3.9), F(-4.0), &quo), 0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_NAN(remquo(F(INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquo(F(-INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquo(F(0), F(NAN), &quo)); + + TEST_FLT_ACCURACY(remquof(F(1.9), F(4.0), &quo), 1.9, 0.001); + TEST_INT(quo, 0); + TEST_FLT(remquof(F(2.0), F(4.0), &quo), 2.0); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquof(F(3.9), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_ACCURACY(remquof(F(-2.0), F(4.0), &quo), -2.0, 0.001); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquof(F(-3.9), F(4.0), &quo), 0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquof(F(-4.1), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquof(F(3.9), F(-4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquof(F(-3.9), F(-4.0), &quo), 0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_NAN(remquof(F(INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquof(F(-INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquof(F(0), F(NAN), &quo)); + + TEST_FLT(remquol(F(1.9), F(4.0), &quo), 1.9); + TEST_INT(quo, 0); + TEST_FLT(remquol(F(2.0), F(4.0), &quo), 2.0); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquol(F(3.9), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_ACCURACY(remquol(F(-2.0), F(4.0), &quo), -2.0, 0.001); + TEST_INT(quo, 0); + TEST_FLT_ACCURACY(remquol(F(-3.9), F(4.0), &quo), 0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquol(F(-4.1), F(4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquol(F(3.9), F(-4.0), &quo), -0.1, 0.001); + TEST_INT(quo, -1); + TEST_FLT_ACCURACY(remquol(F(-3.9), F(-4.0), &quo), 0.1, 0.001); + TEST_INT(quo, 1); + TEST_FLT_NAN(remquol(F(INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquol(F(-INFINITY), F(4.0), &quo)); + TEST_FLT_NAN(remquol(F(0), F(NAN), &quo)); + for (i = 0; i < 2; i++) { if (i == 0) { // Use the default env in the first round here