t-prec.cc
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:6k
- /* Test precision of mpf_class expressions.
- Copyright 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
- This file is part of the GNU MP Library.
- The GNU MP Library is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 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 Lesser General Public
- License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
- #include "config.h"
- #include <iostream>
- #include "gmp.h"
- #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;
- }