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