|
Packit |
5c3484 |
/* Test precision of mpf_class expressions.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
Copyright 2001-2003, 2008 Free Software Foundation, Inc.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
This file is part of the GNU MP Library test suite.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
The GNU MP Library test suite is free software; you can redistribute it
|
|
Packit |
5c3484 |
and/or modify it under the terms of the GNU General Public License as
|
|
Packit |
5c3484 |
published by the Free Software Foundation; either version 3 of the License,
|
|
Packit |
5c3484 |
or (at your option) any later version.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
The GNU MP Library test suite is distributed in the hope that it will be
|
|
Packit |
5c3484 |
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
5c3484 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit |
5c3484 |
Public License for more details.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
You should have received a copy of the GNU General Public License along with
|
|
Packit |
5c3484 |
the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#include "config.h"
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#include <iostream>
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#include "gmp.h"
|
|
Packit |
5c3484 |
#include "gmpxx.h"
|
|
Packit |
5c3484 |
#include "gmp-impl.h"
|
|
Packit |
5c3484 |
#include "tests.h"
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
using namespace std;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
const int
|
|
Packit |
5c3484 |
small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#define ASSERT_ALWAYS_PREC(a, s, prec) \
|
|
Packit |
5c3484 |
{ \
|
|
Packit |
5c3484 |
mpf_srcptr _a = a.get_mpf_t(); \
|
|
Packit |
5c3484 |
mpf_class _b(s, prec); \
|
|
Packit |
5c3484 |
mpf_srcptr _c = _b.get_mpf_t(); \
|
|
Packit |
5c3484 |
ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); \
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
void
|
|
Packit |
5c3484 |
check_mpf (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_set_default_prec(medium_prec);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// simple expressions
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpf_class g(1 / f, very_large_prec);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33333 33333 33333 33333 333", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = 1 / f;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111"
|
|
Packit |
5c3484 |
" 11111 11111 11111 11111 11111 111", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(15.0, large_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = 1 / f;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 66666 66666 66666 66666 667", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// compound expressions
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpf_class g(-(-(-1 / f)), very_large_prec);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33333 33333 33333 33333 333", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec), g(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class h(0.0, very_large_prec);
|
|
Packit |
5c3484 |
h = 1/f + 1/g;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444"
|
|
Packit |
5c3484 |
" 44444 44444 44444 44444 44444 444", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec);
|
|
Packit |
5c3484 |
mpf_class i(0.0, very_large_prec);
|
|
Packit |
5c3484 |
i = f / g + h;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33333 33333 33333 33333 3", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpf_class g(-(1 + f) / 3, very_large_prec);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33333 33333 33333 33333 33", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = sqrt(1 / f);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33333 33333 33333 33333 333", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(15.0, large_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = hypot(1 + 5 / f, 1.0);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 66666 66666 66666 66666 67", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// compound assignments
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec), g(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class h(1.0, very_large_prec);
|
|
Packit |
5c3484 |
h -= f / g;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 66666 66666 66666 66666 667", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// construction from expressions
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(1 / f);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(1 / f);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(15.0, large_prec);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(1 / f);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 6667", large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec), g(9.0, medium_prec);
|
|
Packit |
5c3484 |
mpf_class h(0.0, very_large_prec);
|
|
Packit |
5c3484 |
h = mpf_class(f / g + 1, large_prec);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 333",
|
|
Packit |
5c3484 |
large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// mixed mpf/mpq expressions
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpq_class q(1, 3);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = f - q;
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 66666 66666 66666 66666 67", very_large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpq_class q(1, 3);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(f - q, large_prec);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
|
|
Packit |
5c3484 |
" 66666 667",
|
|
Packit |
5c3484 |
large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(3.0, small_prec);
|
|
Packit |
5c3484 |
mpq_class q(1, 3);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(f - q);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
mpf_class f(15.0, large_prec);
|
|
Packit |
5c3484 |
mpq_class q(1, 3);
|
|
Packit |
5c3484 |
mpf_class g(0.0, very_large_prec);
|
|
Packit |
5c3484 |
g = mpf_class(f + q);
|
|
Packit |
5c3484 |
ASSERT_ALWAYS_PREC
|
|
Packit |
5c3484 |
(g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
|
|
Packit |
5c3484 |
" 33333 33",
|
|
Packit |
5c3484 |
large_prec);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
int
|
|
Packit |
5c3484 |
main (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
tests_start();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
check_mpf();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
tests_end();
|
|
Packit |
5c3484 |
return 0;
|
|
Packit |
5c3484 |
}
|