github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/cxx/t-prec.cc (about) 1 /* Test precision of mpf_class expressions. 2 3 Copyright 2001-2003, 2008 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://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 }