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