Home | History | Annotate | Line # | Download | only in cxx
t-prec.cc revision 1.1.1.2
      1      1.1  mrg /* Test precision of mpf_class expressions.
      2      1.1  mrg 
      3      1.1  mrg Copyright 2001, 2002, 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.2  mrg the GNU MP Library test suite.  If not, see http://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 "gmp.h"
     25      1.1  mrg #include "gmpxx.h"
     26      1.1  mrg #include "gmp-impl.h"
     27      1.1  mrg #include "tests.h"
     28      1.1  mrg 
     29      1.1  mrg using namespace std;
     30      1.1  mrg 
     31      1.1  mrg 
     32      1.1  mrg const int
     33      1.1  mrg small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256;
     34      1.1  mrg 
     35      1.1  mrg #define ASSERT_ALWAYS_PREC(a, s, prec) \
     36      1.1  mrg {                                      \
     37      1.1  mrg   mpf_srcptr _a = a.get_mpf_t();       \
     38      1.1  mrg   mpf_class _b(s, prec);               \
     39      1.1  mrg   mpf_srcptr _c = _b.get_mpf_t();      \
     40      1.1  mrg   ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); \
     41      1.1  mrg }
     42      1.1  mrg 
     43      1.1  mrg 
     44      1.1  mrg 
     45      1.1  mrg void
     46      1.1  mrg check_mpf (void)
     47      1.1  mrg {
     48      1.1  mrg   mpf_set_default_prec(medium_prec);
     49      1.1  mrg 
     50      1.1  mrg   // simple expressions
     51      1.1  mrg   {
     52      1.1  mrg     mpf_class f(3.0, small_prec);
     53      1.1  mrg     mpf_class g(1 / f, very_large_prec);
     54      1.1  mrg     ASSERT_ALWAYS_PREC
     55      1.1  mrg       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     56      1.1  mrg        "     33333 33333 33333 33333 33333 333", very_large_prec);
     57      1.1  mrg   }
     58      1.1  mrg   {
     59      1.1  mrg     mpf_class f(9.0, medium_prec);
     60      1.1  mrg     mpf_class g(0.0, very_large_prec);
     61      1.1  mrg     g = 1 / f;
     62      1.1  mrg     ASSERT_ALWAYS_PREC
     63      1.1  mrg       (g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111"
     64      1.1  mrg        "     11111 11111 11111 11111 11111 111", very_large_prec);
     65      1.1  mrg   }
     66      1.1  mrg   {
     67      1.1  mrg     mpf_class f(15.0, large_prec);
     68      1.1  mrg     mpf_class g(0.0, very_large_prec);
     69      1.1  mrg     g = 1 / f;
     70      1.1  mrg     ASSERT_ALWAYS_PREC
     71      1.1  mrg       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
     72      1.1  mrg        "     66666 66666 66666 66666 66666 667", very_large_prec);
     73      1.1  mrg   }
     74      1.1  mrg 
     75      1.1  mrg   // compound expressions
     76      1.1  mrg   {
     77      1.1  mrg     mpf_class f(3.0, small_prec);
     78      1.1  mrg     mpf_class g(-(-(-1 / f)), very_large_prec);
     79      1.1  mrg     ASSERT_ALWAYS_PREC
     80      1.1  mrg       (g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     81      1.1  mrg        "      33333 33333 33333 33333 33333 333", very_large_prec);
     82      1.1  mrg   }
     83      1.1  mrg   {
     84      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
     85      1.1  mrg     mpf_class h(0.0, very_large_prec);
     86      1.1  mrg     h = 1/f + 1/g;
     87      1.1  mrg     ASSERT_ALWAYS_PREC
     88      1.1  mrg       (h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444"
     89      1.1  mrg        "     44444 44444 44444 44444 44444 444", very_large_prec);
     90      1.1  mrg   }
     91      1.1  mrg   {
     92      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec);
     93      1.1  mrg     mpf_class i(0.0, very_large_prec);
     94      1.1  mrg     i = f / g + h;
     95      1.1  mrg     ASSERT_ALWAYS_PREC
     96      1.1  mrg       (i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
     97      1.1  mrg        "      33333 33333 33333 33333 33333 3", very_large_prec);
     98      1.1  mrg   }
     99      1.1  mrg   {
    100      1.1  mrg     mpf_class f(3.0, small_prec);
    101      1.1  mrg     mpf_class g(-(1 + f) / 3, very_large_prec);
    102      1.1  mrg     ASSERT_ALWAYS_PREC
    103      1.1  mrg       (g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    104      1.1  mrg        "      33333 33333 33333 33333 33333 33", very_large_prec);
    105      1.1  mrg   }
    106      1.1  mrg   {
    107      1.1  mrg     mpf_class f(9.0, medium_prec);
    108      1.1  mrg     mpf_class g(0.0, very_large_prec);
    109      1.1  mrg     g = sqrt(1 / f);
    110      1.1  mrg     ASSERT_ALWAYS_PREC
    111      1.1  mrg       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    112      1.1  mrg        "     33333 33333 33333 33333 33333 333", very_large_prec);
    113      1.1  mrg   }
    114      1.1  mrg   {
    115      1.1  mrg     mpf_class f(15.0, large_prec);
    116      1.1  mrg     mpf_class g(0.0, very_large_prec);
    117      1.1  mrg     g = hypot(1 + 5 / f, 1.0);
    118      1.1  mrg     ASSERT_ALWAYS_PREC
    119      1.1  mrg       (g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    120      1.1  mrg        "     66666 66666 66666 66666 66666 67", very_large_prec);
    121      1.1  mrg   }
    122      1.1  mrg 
    123      1.1  mrg   // compound assignments
    124      1.1  mrg   {
    125      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
    126      1.1  mrg     mpf_class h(1.0, very_large_prec);
    127      1.1  mrg     h -= f / g;
    128      1.1  mrg     ASSERT_ALWAYS_PREC
    129      1.1  mrg       (h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    130      1.1  mrg        "     66666 66666 66666 66666 66666 667", very_large_prec);
    131      1.1  mrg   }
    132      1.1  mrg 
    133      1.1  mrg   // construction from expressions
    134      1.1  mrg   {
    135      1.1  mrg     mpf_class f(3.0, small_prec);
    136      1.1  mrg     mpf_class g(0.0, very_large_prec);
    137      1.1  mrg     g = mpf_class(1 / f);
    138      1.1  mrg     ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec);
    139      1.1  mrg   }
    140      1.1  mrg   {
    141      1.1  mrg     mpf_class f(9.0, medium_prec);
    142      1.1  mrg     mpf_class g(0.0, very_large_prec);
    143      1.1  mrg     g = mpf_class(1 / f);
    144      1.1  mrg     ASSERT_ALWAYS_PREC
    145      1.1  mrg       (g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec);
    146      1.1  mrg   }
    147      1.1  mrg   {
    148      1.1  mrg     mpf_class f(15.0, large_prec);
    149      1.1  mrg     mpf_class g(0.0, very_large_prec);
    150      1.1  mrg     g = mpf_class(1 / f);
    151      1.1  mrg     ASSERT_ALWAYS_PREC
    152      1.1  mrg       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    153      1.1  mrg        "     66666 6667", large_prec);
    154      1.1  mrg   }
    155      1.1  mrg 
    156      1.1  mrg   {
    157      1.1  mrg     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
    158      1.1  mrg     mpf_class h(0.0, very_large_prec);
    159      1.1  mrg     h = mpf_class(f / g + 1, large_prec);
    160      1.1  mrg     ASSERT_ALWAYS_PREC
    161      1.1  mrg       (h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    162      1.1  mrg        "     33333 333",
    163      1.1  mrg        large_prec);
    164      1.1  mrg   }
    165      1.1  mrg 
    166      1.1  mrg   // mixed mpf/mpq expressions
    167      1.1  mrg   {
    168      1.1  mrg     mpf_class f(3.0, small_prec);
    169      1.1  mrg     mpq_class q(1, 3);
    170      1.1  mrg     mpf_class g(0.0, very_large_prec);
    171      1.1  mrg     g = f - q;
    172      1.1  mrg     ASSERT_ALWAYS_PREC
    173      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    174      1.1  mrg        "     66666 66666 66666 66666 66666 67", very_large_prec);
    175      1.1  mrg   }
    176      1.1  mrg 
    177      1.1  mrg   {
    178      1.1  mrg     mpf_class f(3.0, small_prec);
    179      1.1  mrg     mpq_class q(1, 3);
    180      1.1  mrg     mpf_class g(0.0, very_large_prec);
    181      1.1  mrg     g = mpf_class(f - q, large_prec);
    182      1.1  mrg     ASSERT_ALWAYS_PREC
    183      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
    184      1.1  mrg        "     66666 667",
    185      1.1  mrg        large_prec);
    186      1.1  mrg   }
    187      1.1  mrg   {
    188      1.1  mrg     mpf_class f(3.0, small_prec);
    189      1.1  mrg     mpq_class q(1, 3);
    190      1.1  mrg     mpf_class g(0.0, very_large_prec);
    191      1.1  mrg     g = mpf_class(f - q);
    192      1.1  mrg     ASSERT_ALWAYS_PREC
    193      1.1  mrg       (g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec);
    194      1.1  mrg   }
    195      1.1  mrg   {
    196      1.1  mrg     mpf_class f(15.0, large_prec);
    197      1.1  mrg     mpq_class q(1, 3);
    198      1.1  mrg     mpf_class g(0.0, very_large_prec);
    199      1.1  mrg     g = mpf_class(f + q);
    200      1.1  mrg     ASSERT_ALWAYS_PREC
    201      1.1  mrg       (g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
    202      1.1  mrg        "      33333 33",
    203      1.1  mrg        large_prec);
    204      1.1  mrg   }
    205      1.1  mrg }
    206      1.1  mrg 
    207      1.1  mrg 
    208      1.1  mrg int
    209      1.1  mrg main (void)
    210      1.1  mrg {
    211      1.1  mrg   tests_start();
    212      1.1  mrg 
    213      1.1  mrg   check_mpf();
    214      1.1  mrg 
    215      1.1  mrg   tests_end();
    216      1.1  mrg   return 0;
    217      1.1  mrg }
    218