From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/tests/cxx/t-prec.cc | 216 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 gmp-6.3.0/tests/cxx/t-prec.cc (limited to 'gmp-6.3.0/tests/cxx/t-prec.cc') diff --git a/gmp-6.3.0/tests/cxx/t-prec.cc b/gmp-6.3.0/tests/cxx/t-prec.cc new file mode 100644 index 0000000..72fca72 --- /dev/null +++ b/gmp-6.3.0/tests/cxx/t-prec.cc @@ -0,0 +1,216 @@ +/* Test precision of mpf_class expressions. + +Copyright 2001-2003, 2008 Free Software Foundation, Inc. + +This file is part of the GNU MP Library test suite. + +The GNU MP Library test suite is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 3 of the License, +or (at your option) any later version. + +The GNU MP Library test suite is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +Public License for more details. + +You should have received a copy of the GNU General Public License along with +the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ + +#include "config.h" + +#include + +#include "gmpxx.h" +#include "gmp-impl.h" +#include "tests.h" + +using namespace std; + + +const int +small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256; + +#define ASSERT_ALWAYS_PREC(a, s, prec) \ +{ \ + mpf_srcptr _a = a.get_mpf_t(); \ + mpf_class _b(s, prec); \ + mpf_srcptr _c = _b.get_mpf_t(); \ + ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); \ +} + + + +void +check_mpf (void) +{ + mpf_set_default_prec(medium_prec); + + // simple expressions + { + mpf_class f(3.0, small_prec); + mpf_class g(1 / f, very_large_prec); + ASSERT_ALWAYS_PREC + (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33333 33333 33333 33333 333", very_large_prec); + } + { + mpf_class f(9.0, medium_prec); + mpf_class g(0.0, very_large_prec); + g = 1 / f; + ASSERT_ALWAYS_PREC + (g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111" + " 11111 11111 11111 11111 11111 111", very_large_prec); + } + { + mpf_class f(15.0, large_prec); + mpf_class g(0.0, very_large_prec); + g = 1 / f; + ASSERT_ALWAYS_PREC + (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 66666 66666 66666 66666 667", very_large_prec); + } + + // compound expressions + { + mpf_class f(3.0, small_prec); + mpf_class g(-(-(-1 / f)), very_large_prec); + ASSERT_ALWAYS_PREC + (g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33333 33333 33333 33333 333", very_large_prec); + } + { + mpf_class f(3.0, small_prec), g(9.0, medium_prec); + mpf_class h(0.0, very_large_prec); + h = 1/f + 1/g; + ASSERT_ALWAYS_PREC + (h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444" + " 44444 44444 44444 44444 44444 444", very_large_prec); + } + { + mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec); + mpf_class i(0.0, very_large_prec); + i = f / g + h; + ASSERT_ALWAYS_PREC + (i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33333 33333 33333 33333 3", very_large_prec); + } + { + mpf_class f(3.0, small_prec); + mpf_class g(-(1 + f) / 3, very_large_prec); + ASSERT_ALWAYS_PREC + (g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33333 33333 33333 33333 33", very_large_prec); + } + { + mpf_class f(9.0, medium_prec); + mpf_class g(0.0, very_large_prec); + g = sqrt(1 / f); + ASSERT_ALWAYS_PREC + (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33333 33333 33333 33333 333", very_large_prec); + } + { + mpf_class f(15.0, large_prec); + mpf_class g(0.0, very_large_prec); + g = hypot(1 + 5 / f, 1.0); + ASSERT_ALWAYS_PREC + (g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 66666 66666 66666 66666 67", very_large_prec); + } + + // compound assignments + { + mpf_class f(3.0, small_prec), g(9.0, medium_prec); + mpf_class h(1.0, very_large_prec); + h -= f / g; + ASSERT_ALWAYS_PREC + (h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 66666 66666 66666 66666 667", very_large_prec); + } + + // construction from expressions + { + mpf_class f(3.0, small_prec); + mpf_class g(0.0, very_large_prec); + g = mpf_class(1 / f); + ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec); + } + { + mpf_class f(9.0, medium_prec); + mpf_class g(0.0, very_large_prec); + g = mpf_class(1 / f); + ASSERT_ALWAYS_PREC + (g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec); + } + { + mpf_class f(15.0, large_prec); + mpf_class g(0.0, very_large_prec); + g = mpf_class(1 / f); + ASSERT_ALWAYS_PREC + (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 6667", large_prec); + } + + { + mpf_class f(3.0, small_prec), g(9.0, medium_prec); + mpf_class h(0.0, very_large_prec); + h = mpf_class(f / g + 1, large_prec); + ASSERT_ALWAYS_PREC + (h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 333", + large_prec); + } + + // mixed mpf/mpq expressions + { + mpf_class f(3.0, small_prec); + mpq_class q(1, 3); + mpf_class g(0.0, very_large_prec); + g = f - q; + ASSERT_ALWAYS_PREC + (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 66666 66666 66666 66666 67", very_large_prec); + } + + { + mpf_class f(3.0, small_prec); + mpq_class q(1, 3); + mpf_class g(0.0, very_large_prec); + g = mpf_class(f - q, large_prec); + ASSERT_ALWAYS_PREC + (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666" + " 66666 667", + large_prec); + } + { + mpf_class f(3.0, small_prec); + mpq_class q(1, 3); + mpf_class g(0.0, very_large_prec); + g = mpf_class(f - q); + ASSERT_ALWAYS_PREC + (g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec); + } + { + mpf_class f(15.0, large_prec); + mpq_class q(1, 3); + mpf_class g(0.0, very_large_prec); + g = mpf_class(f + q); + ASSERT_ALWAYS_PREC + (g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333" + " 33333 33", + large_prec); + } +} + + +int +main (void) +{ + tests_start(); + + check_mpf(); + + tests_end(); + return 0; +} -- cgit v1.2.3