Home | History | Annotate | Line # | Download | only in cxx
      1      1.1  mrg /* Test precision of mpf_class expressions.
      2      1.1  mrg 
      3  1.1.1.3  mrg Copyright 2001-2003, 2008 Free Software Foundation, Inc.
      4      1.1  mrg 
      5  1.1.1.2  mrg This file is part of the GNU MP Library test suite.
      6      1.1  mrg 
      7  1.1.1.2  mrg The GNU MP Library test suite is free software; you can redistribute it
      8  1.1.1.2  mrg and/or modify it under the terms of the GNU General Public License as
      9  1.1.1.2  mrg published by the Free Software Foundation; either version 3 of the License,
     10  1.1.1.2  mrg or (at your option) any later version.
     11  1.1.1.2  mrg 
     12  1.1.1.2  mrg The GNU MP Library test suite is distributed in the hope that it will be
     13  1.1.1.2  mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.2  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15  1.1.1.2  mrg Public License for more details.
     16      1.1  mrg 
     17  1.1.1.2  mrg You should have received a copy of the GNU General Public License along with
     18  1.1.1.3  mrg the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
     19      1.1  mrg 
     20      1.1  mrg #include "config.h"
     21      1.1  mrg 
     22      1.1  mrg #include <iostream>
     23      1.1  mrg 
     24      1.1  mrg #include "gmpxx.h"
     25      1.1  mrg #include "gmp-impl.h"
     26      1.1  mrg #include "tests.h"
     27      1.1  mrg 
     28      1.1  mrg using namespace std;
     29      1.1  mrg 
     30      1.1  mrg 
     31      1.1  mrg const int
     32      1.1  mrg small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256;
     33      1.1  mrg 
     34      1.1  mrg #define ASSERT_ALWAYS_PREC(a, s, prec) \
     35      1.1  mrg {                                      \
     36      1.1  mrg   mpf_srcptr _a = a.get_mpf_t();       \
     37      1.1  mrg   mpf_class _b(s, prec);               \
     38      1.1  mrg   mpf_srcptr _c = _b.get_mpf_t();      \
     39      1.1  mrg   ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); \
     40      1.1  mrg }
     41      1.1  mrg 
     42      1.1  mrg 
     43      1.1  mrg 
     44      1.1  mrg void
     45      1.1  mrg check_mpf (void)
     46      1.1  mrg {
     47      1.1  mrg   mpf_set_default_prec(medium_prec);
     48      1.1  mrg 
     49      1.1  mrg   // simple expressions
     50      1.1  mrg   {
     51      1.1  mrg     mpf_class f(3.0, small_prec);
     52      1.1  mrg     mpf_class g(1 / f, very_large_prec);
     53      1.1  mrg     ASSERT_ALWAYS_PREC
     54      1.1  mrg       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     55      1.1  mrg        "     33333 33333 33333 33333 33333 333", very_large_prec);
     56      1.1  mrg   }
     57      1.1  mrg   {
     58      1.1  mrg     mpf_class f(9.0, medium_prec);
     59      1.1  mrg     mpf_class g(0.0, very_large_prec);
     60      1.1  mrg     g = 1 / f;
     61      1.1  mrg     ASSERT_ALWAYS_PREC
     62      1.1  mrg       (g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111"
     63      1.1  mrg        "     11111 11111 11111 11111 11111 111", very_large_prec);
     64      1.1  mrg   }
     65      1.1  mrg   {
     66      1.1  mrg     mpf_class f(15.0, large_prec);
     67      1.1  mrg     mpf_class g(0.0, very_large_prec);
     68      1.1  mrg     g = 1 / f;
     69      1.1  mrg     ASSERT_ALWAYS_PREC
     70      1.1  mrg       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
     71      1.1  mrg        "     66666 66666 66666 66666 66666 667", very_large_prec);
     72      1.1  mrg   }
     73      1.1  mrg 
     74      1.1  mrg   // compound expressions
     75      1.1  mrg   {
     76      1.1  mrg     mpf_class f(3.0, small_prec);
     77      1.1  mrg     mpf_class g(-(-(-1 / f)), very_large_prec);
     78      1.1  mrg     ASSERT_ALWAYS_PREC
     79      1.1  mrg       (g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     80      1.1  mrg        "      33333 33333 33333 33333 33333 333", very_large_prec);
     81      1.1  mrg   }
     82      1.1  mrg   {
     83      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
     84      1.1  mrg     mpf_class h(0.0, very_large_prec);
     85      1.1  mrg     h = 1/f + 1/g;
     86      1.1  mrg     ASSERT_ALWAYS_PREC
     87      1.1  mrg       (h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444"
     88      1.1  mrg        "     44444 44444 44444 44444 44444 444", very_large_prec);
     89      1.1  mrg   }
     90      1.1  mrg   {
     91      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec);
     92      1.1  mrg     mpf_class i(0.0, very_large_prec);
     93      1.1  mrg     i = f / g + h;
     94      1.1  mrg     ASSERT_ALWAYS_PREC
     95      1.1  mrg       (i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     96      1.1  mrg        "      33333 33333 33333 33333 33333 3", very_large_prec);
     97      1.1  mrg   }
     98      1.1  mrg   {
     99      1.1  mrg     mpf_class f(3.0, small_prec);
    100      1.1  mrg     mpf_class g(-(1 + f) / 3, very_large_prec);
    101      1.1  mrg     ASSERT_ALWAYS_PREC
    102      1.1  mrg       (g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    103      1.1  mrg        "      33333 33333 33333 33333 33333 33", very_large_prec);
    104      1.1  mrg   }
    105      1.1  mrg   {
    106      1.1  mrg     mpf_class f(9.0, medium_prec);
    107      1.1  mrg     mpf_class g(0.0, very_large_prec);
    108      1.1  mrg     g = sqrt(1 / f);
    109      1.1  mrg     ASSERT_ALWAYS_PREC
    110      1.1  mrg       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    111      1.1  mrg        "     33333 33333 33333 33333 33333 333", very_large_prec);
    112      1.1  mrg   }
    113      1.1  mrg   {
    114      1.1  mrg     mpf_class f(15.0, large_prec);
    115      1.1  mrg     mpf_class g(0.0, very_large_prec);
    116      1.1  mrg     g = hypot(1 + 5 / f, 1.0);
    117      1.1  mrg     ASSERT_ALWAYS_PREC
    118      1.1  mrg       (g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    119      1.1  mrg        "     66666 66666 66666 66666 66666 67", very_large_prec);
    120      1.1  mrg   }
    121      1.1  mrg 
    122      1.1  mrg   // compound assignments
    123      1.1  mrg   {
    124      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
    125      1.1  mrg     mpf_class h(1.0, very_large_prec);
    126      1.1  mrg     h -= f / g;
    127      1.1  mrg     ASSERT_ALWAYS_PREC
    128      1.1  mrg       (h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    129      1.1  mrg        "     66666 66666 66666 66666 66666 667", very_large_prec);
    130      1.1  mrg   }
    131      1.1  mrg 
    132      1.1  mrg   // construction from expressions
    133      1.1  mrg   {
    134      1.1  mrg     mpf_class f(3.0, small_prec);
    135      1.1  mrg     mpf_class g(0.0, very_large_prec);
    136      1.1  mrg     g = mpf_class(1 / f);
    137      1.1  mrg     ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec);
    138      1.1  mrg   }
    139      1.1  mrg   {
    140      1.1  mrg     mpf_class f(9.0, medium_prec);
    141      1.1  mrg     mpf_class g(0.0, very_large_prec);
    142      1.1  mrg     g = mpf_class(1 / f);
    143      1.1  mrg     ASSERT_ALWAYS_PREC
    144      1.1  mrg       (g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec);
    145      1.1  mrg   }
    146      1.1  mrg   {
    147      1.1  mrg     mpf_class f(15.0, large_prec);
    148      1.1  mrg     mpf_class g(0.0, very_large_prec);
    149      1.1  mrg     g = mpf_class(1 / f);
    150      1.1  mrg     ASSERT_ALWAYS_PREC
    151      1.1  mrg       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    152      1.1  mrg        "     66666 6667", large_prec);
    153      1.1  mrg   }
    154      1.1  mrg 
    155      1.1  mrg   {
    156      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
    157      1.1  mrg     mpf_class h(0.0, very_large_prec);
    158      1.1  mrg     h = mpf_class(f / g + 1, large_prec);
    159      1.1  mrg     ASSERT_ALWAYS_PREC
    160      1.1  mrg       (h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    161      1.1  mrg        "     33333 333",
    162      1.1  mrg        large_prec);
    163      1.1  mrg   }
    164      1.1  mrg 
    165      1.1  mrg   // mixed mpf/mpq expressions
    166      1.1  mrg   {
    167      1.1  mrg     mpf_class f(3.0, small_prec);
    168      1.1  mrg     mpq_class q(1, 3);
    169      1.1  mrg     mpf_class g(0.0, very_large_prec);
    170      1.1  mrg     g = f - q;
    171      1.1  mrg     ASSERT_ALWAYS_PREC
    172      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    173      1.1  mrg        "     66666 66666 66666 66666 66666 67", very_large_prec);
    174      1.1  mrg   }
    175      1.1  mrg 
    176      1.1  mrg   {
    177      1.1  mrg     mpf_class f(3.0, small_prec);
    178      1.1  mrg     mpq_class q(1, 3);
    179      1.1  mrg     mpf_class g(0.0, very_large_prec);
    180      1.1  mrg     g = mpf_class(f - q, large_prec);
    181      1.1  mrg     ASSERT_ALWAYS_PREC
    182      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    183      1.1  mrg        "     66666 667",
    184      1.1  mrg        large_prec);
    185      1.1  mrg   }
    186      1.1  mrg   {
    187      1.1  mrg     mpf_class f(3.0, small_prec);
    188      1.1  mrg     mpq_class q(1, 3);
    189      1.1  mrg     mpf_class g(0.0, very_large_prec);
    190      1.1  mrg     g = mpf_class(f - q);
    191      1.1  mrg     ASSERT_ALWAYS_PREC
    192      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec);
    193      1.1  mrg   }
    194      1.1  mrg   {
    195      1.1  mrg     mpf_class f(15.0, large_prec);
    196      1.1  mrg     mpq_class q(1, 3);
    197      1.1  mrg     mpf_class g(0.0, very_large_prec);
    198      1.1  mrg     g = mpf_class(f + q);
    199      1.1  mrg     ASSERT_ALWAYS_PREC
    200      1.1  mrg       (g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    201      1.1  mrg        "      33333 33",
    202      1.1  mrg        large_prec);
    203      1.1  mrg   }
    204      1.1  mrg }
    205      1.1  mrg 
    206      1.1  mrg 
    207      1.1  mrg int
    208      1.1  mrg main (void)
    209      1.1  mrg {
    210      1.1  mrg   tests_start();
    211      1.1  mrg 
    212      1.1  mrg   check_mpf();
    213      1.1  mrg 
    214      1.1  mrg   tests_end();
    215      1.1  mrg   return 0;
    216      1.1  mrg }
    217