1 1.1 mrg /* Test expression evaluation (print nothing and exit 0 if successful). 2 1.1 mrg 3 1.1.1.2 mrg Copyright 2000-2004 Free Software Foundation, Inc. 4 1.1 mrg 5 1.1 mrg This file is part of the GNU MP Library. 6 1.1 mrg 7 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify 8 1.1.1.2 mrg it under the terms of either: 9 1.1.1.2 mrg 10 1.1.1.2 mrg * the GNU Lesser General Public License as published by the Free 11 1.1.1.2 mrg Software Foundation; either version 3 of the License, or (at your 12 1.1.1.2 mrg option) any later version. 13 1.1.1.2 mrg 14 1.1.1.2 mrg or 15 1.1.1.2 mrg 16 1.1.1.2 mrg * the GNU General Public License as published by the Free Software 17 1.1.1.2 mrg Foundation; either version 2 of the License, or (at your option) any 18 1.1.1.2 mrg later version. 19 1.1.1.2 mrg 20 1.1.1.2 mrg or both in parallel, as here. 21 1.1 mrg 22 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but 23 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24 1.1.1.2 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25 1.1.1.2 mrg for more details. 26 1.1 mrg 27 1.1.1.2 mrg You should have received copies of the GNU General Public License and the 28 1.1.1.2 mrg GNU Lesser General Public License along with the GNU MP Library. If not, 29 1.1.1.2 mrg see https://www.gnu.org/licenses/. */ 30 1.1 mrg 31 1.1 mrg #include <stdio.h> 32 1.1 mrg #include <stdlib.h> 33 1.1 mrg 34 1.1.1.3 mrg #include "gmp-impl.h" 35 1.1 mrg #include "tests.h" 36 1.1 mrg #include "expr-impl.h" 37 1.1 mrg 38 1.1 mrg 39 1.1 mrg int option_trace = 0; 40 1.1 mrg 41 1.1 mrg 42 1.1 mrg struct data_t { 43 1.1 mrg int base; 44 1.1 mrg const char *expr; 45 1.1 mrg const char *want; 46 1.1 mrg }; 47 1.1 mrg 48 1.1 mrg #define numberof(x) (sizeof (x) / sizeof ((x)[0])) 49 1.1 mrg 50 1.1 mrg 51 1.1 mrg /* These data_xxx[] arrays are tables to be tested with one or more of the 52 1.1 mrg mp?_t types. z=mpz_t, q=mpz_t, f=mpf_t. */ 53 1.1 mrg 54 1.1 mrg struct data_t data_zqf[] = { 55 1.1 mrg 56 1.1 mrg /* various deliberately wrong expressions */ 57 1.1 mrg { 0, "", NULL }, 58 1.1 mrg { 0, "1+", NULL }, 59 1.1 mrg { 0, "+2", NULL }, 60 1.1 mrg { 0, "1,2", NULL }, 61 1.1 mrg { 0, "foo(1,2)", NULL }, 62 1.1 mrg { 0, "1+foo", NULL }, 63 1.1 mrg { 10, "0fff", NULL }, 64 1.1 mrg { 0, "!", NULL }, 65 1.1 mrg { 0, "10!", NULL }, 66 1.1 mrg { 0, "-10!", NULL }, 67 1.1 mrg { 0, "gcd((4,6))", NULL }, 68 1.1 mrg { 0, "()", NULL }, 69 1.1 mrg { 0, "fac(2**1000)", NULL }, 70 1.1 mrg { 0, "$", NULL }, 71 1.1 mrg { 0, "$-", NULL }, 72 1.1 mrg 73 1.1 mrg /* some basics */ 74 1.1 mrg { 10, "123", "123" }, 75 1.1 mrg { 10, "-123", "-123" }, 76 1.1 mrg { 10, "1+2", "3" }, 77 1.1 mrg { 10, "1+2+3", "6" }, 78 1.1 mrg { 10, "1+2*3", "7" }, 79 1.1 mrg { 10, "3*2+1", "7" }, 80 1.1 mrg { 10, "$a", "55" }, 81 1.1 mrg { 10, "b", "99" }, 82 1.1 mrg { 16, "b", "11" }, 83 1.1 mrg { 10, "4**3 * 2 + 1", "129" }, 84 1.1 mrg { 10, "1<2", "1" }, 85 1.1 mrg { 10, "1>2", "0" }, 86 1.1 mrg 87 1.1 mrg { 10, "(123)", "123" }, 88 1.1 mrg 89 1.1 mrg { 10, "sgn(-123)", "-1" }, 90 1.1 mrg { 10, "5-7", "-2" }, 91 1.1 mrg 92 1.1 mrg { 0, "cmp(0,0)", "0" }, 93 1.1 mrg { 0, "cmp(1,0)", "1" }, 94 1.1 mrg { 0, "cmp(0,1)", "-1" }, 95 1.1 mrg { 0, "cmp(-1,0)", "-1" }, 96 1.1 mrg { 0, "cmp(0,-1)", "1" }, 97 1.1 mrg 98 1.1 mrg { 10, "0 ? 123 : 456", "456" }, 99 1.1 mrg { 10, "1 ? 4+5 : 6+7", "9" }, 100 1.1 mrg 101 1.1 mrg { 10, "(123)", "123" }, 102 1.1 mrg { 10, "(2+3)", "5" }, 103 1.1 mrg { 10, "(4+5)*(5+6)", "99" }, 104 1.1 mrg 105 1.1 mrg { 0, "1 << 16", "65536" }, 106 1.1 mrg { 0, "256 >> 4", "16" }, 107 1.1 mrg { 0, "-256 >> 4", "-16" }, 108 1.1 mrg 109 1.1 mrg { 0, "!1", "0" }, 110 1.1 mrg { 0, "!9", "0" }, 111 1.1 mrg { 0, "!0", "1" }, 112 1.1 mrg 113 1.1 mrg { 0, "2**2**2", "16" }, 114 1.1 mrg { 0, "-2**2**2", "-16" }, 115 1.1 mrg 116 1.1 mrg { 0, "0x100", "256" }, 117 1.1 mrg { 10, "0x100", NULL }, 118 1.1 mrg { 10, "0x 100", NULL }, 119 1.1 mrg 120 1.1 mrg { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" }, 121 1.1 mrg { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" }, 122 1.1 mrg { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" }, 123 1.1 mrg 124 1.1 mrg { 10, "abs(123)", "123" }, 125 1.1 mrg { 10, "abs(-123)", "123" }, 126 1.1 mrg { 10, "abs(0)", "0" }, 127 1.1 mrg 128 1.1 mrg /* filling data stack */ 129 1.1 mrg { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" }, 130 1.1 mrg 131 1.1 mrg /* filling control stack */ 132 1.1 mrg { 0, "----------------------------------------------------1", "1" }, 133 1.1 mrg }; 134 1.1 mrg 135 1.1 mrg 136 1.1 mrg const struct data_t data_z[] = { 137 1.1 mrg { 0, "divisible_p(333,3)", "1" }, 138 1.1 mrg { 0, "congruent_p(7,1,3)", "1" }, 139 1.1 mrg 140 1.1 mrg { 0, "cmpabs(0,0)", "0" }, 141 1.1 mrg { 0, "cmpabs(1,0)", "1" }, 142 1.1 mrg { 0, "cmpabs(0,1)", "-1" }, 143 1.1 mrg { 0, "cmpabs(-1,0)", "1" }, 144 1.1 mrg { 0, "cmpabs(0,-1)", "-1" }, 145 1.1 mrg 146 1.1 mrg { 0, "odd_p(1)", "1" }, 147 1.1 mrg { 0, "odd_p(0)", "0" }, 148 1.1 mrg { 0, "odd_p(-1)", "1" }, 149 1.1 mrg 150 1.1 mrg { 0, "even_p(1)", "0" }, 151 1.1 mrg { 0, "even_p(0)", "1" }, 152 1.1 mrg { 0, "even_p(-1)", "0" }, 153 1.1 mrg 154 1.1 mrg { 0, "fac(0)", "1" }, 155 1.1 mrg { 0, "fac(1)", "1" }, 156 1.1 mrg { 0, "fac(2)", "2" }, 157 1.1 mrg { 0, "fac(3)", "6" }, 158 1.1 mrg { 0, "fac(10)", "3628800" }, 159 1.1 mrg 160 1.1 mrg { 10, "root(81,4)", "3" }, 161 1.1 mrg 162 1.1 mrg { 10, "gcd(4,6)", "2" }, 163 1.1 mrg { 10, "gcd(4,6,9)", "1" }, 164 1.1 mrg 165 1.1 mrg { 10, "powm(3,2,9)", "0" }, 166 1.1 mrg { 10, "powm(3,2,8)", "1" }, 167 1.1 mrg 168 1.1 mrg /* filling data stack */ 169 1.1 mrg { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" }, 170 1.1 mrg 171 1.1 mrg /* filling control stack */ 172 1.1 mrg { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" }, 173 1.1 mrg 174 1.1 mrg { 0, "fib(10)", "55" }, 175 1.1 mrg 176 1.1 mrg { 0, "setbit(0,5)", "32" }, 177 1.1 mrg { 0, "clrbit(32,5)", "0" }, 178 1.1 mrg { 0, "tstbit(32,5)", "1" }, 179 1.1 mrg { 0, "tstbit(32,4)", "0" }, 180 1.1 mrg { 0, "scan0(7,0)", "3" }, 181 1.1 mrg { 0, "scan1(7,0)", "0" }, 182 1.1 mrg }; 183 1.1 mrg 184 1.1 mrg const struct data_t data_zq[] = { 185 1.1 mrg /* expecting failure */ 186 1.1 mrg { 0, "1.2", NULL }, 187 1.1 mrg }; 188 1.1 mrg 189 1.1 mrg const struct data_t data_q[] = { 190 1.1 mrg { 10, "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" }, 191 1.1 mrg { 0, "num(5/9)", "5" }, 192 1.1 mrg { 0, "den(5/9)", "9" }, 193 1.1 mrg }; 194 1.1 mrg 195 1.1 mrg const struct data_t data_zf[] = { 196 1.1 mrg { 10, "sqrt ( 49 )", "7" }, 197 1.1 mrg { 10, "sqrt ( 49 ) + 1", "8" }, 198 1.1 mrg { 10, "sqrt((49))", "7" }, 199 1.1 mrg { 10, "sqrt((((((((49))))))))", "7" }, 200 1.1 mrg }; 201 1.1 mrg 202 1.1 mrg const struct data_t data_f[] = { 203 1.1 mrg { 0, "1@10", "10000000000" }, 204 1.1 mrg { 0, "1.5@10", "15000000000" }, 205 1.1 mrg { 0, "1000@-1", "100" }, 206 1.1 mrg { 0, "10.00@-1", "1" }, 207 1.1 mrg 208 1.1 mrg { 0, "1e10", "10000000000" }, 209 1.1 mrg { 0, "1.5e10", "15000000000" }, 210 1.1 mrg { 0, "1000e-1", "100" }, 211 1.1 mrg { 0, "10.00e-1", "1" }, 212 1.1 mrg 213 1.1 mrg { 16, "1@9", "68719476736" }, 214 1.1 mrg 215 1.1 mrg { 16, "1@10", "18446744073709551616" }, 216 1.1 mrg { -16, "1@10", "1099511627776" }, 217 1.1 mrg 218 1.1 mrg { 0, "ceil(0)", "0" }, 219 1.1 mrg { 0, "ceil(0.25)", "1" }, 220 1.1 mrg { 0, "ceil(0.5)", "1" }, 221 1.1 mrg { 0, "ceil(1.5)", "2" }, 222 1.1 mrg { 0, "ceil(-0.5)", "0" }, 223 1.1 mrg { 0, "ceil(-1.5)", "-1" }, 224 1.1 mrg 225 1.1 mrg /* only simple cases because mpf_eq currently only works on whole limbs */ 226 1.1 mrg { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" }, 227 1.1 mrg { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" }, 228 1.1 mrg 229 1.1 mrg { 0, "floor(0)", "0" }, 230 1.1 mrg { 0, "floor(0.25)", "0" }, 231 1.1 mrg { 0, "floor(0.5)", "0" }, 232 1.1 mrg { 0, "floor(1.5)", "1" }, 233 1.1 mrg { 0, "floor(-0.5)", "-1" }, 234 1.1 mrg { 0, "floor(-1.5)", "-2" }, 235 1.1 mrg 236 1.1 mrg { 0, "integer_p(1)", "1" }, 237 1.1 mrg { 0, "integer_p(0.5)", "0" }, 238 1.1 mrg 239 1.1 mrg { 0, "trunc(0)", "0" }, 240 1.1 mrg { 0, "trunc(0.25)", "0" }, 241 1.1 mrg { 0, "trunc(0.5)", "0" }, 242 1.1 mrg { 0, "trunc(1.5)", "1" }, 243 1.1 mrg { 0, "trunc(-0.5)", "0" }, 244 1.1 mrg { 0, "trunc(-1.5)", "-1" }, 245 1.1 mrg }; 246 1.1 mrg 247 1.1 mrg struct datalist_t { 248 1.1 mrg const struct data_t *data; 249 1.1 mrg int num; 250 1.1 mrg }; 251 1.1 mrg 252 1.1 mrg #define DATALIST(data) { data, numberof (data) } 253 1.1 mrg 254 1.1 mrg struct datalist_t list_z[] = { 255 1.1 mrg DATALIST (data_z), 256 1.1 mrg DATALIST (data_zq), 257 1.1 mrg DATALIST (data_zf), 258 1.1 mrg DATALIST (data_zqf), 259 1.1 mrg }; 260 1.1 mrg 261 1.1 mrg struct datalist_t list_q[] = { 262 1.1 mrg DATALIST (data_q), 263 1.1 mrg DATALIST (data_zq), 264 1.1 mrg DATALIST (data_zqf), 265 1.1 mrg }; 266 1.1 mrg 267 1.1 mrg struct datalist_t list_f[] = { 268 1.1 mrg DATALIST (data_zf), 269 1.1 mrg DATALIST (data_zqf), 270 1.1 mrg DATALIST (data_f), 271 1.1 mrg }; 272 1.1 mrg 273 1.1 mrg 274 1.1 mrg void 275 1.1 mrg check_z (void) 276 1.1 mrg { 277 1.1 mrg const struct data_t *data; 278 1.1 mrg mpz_t a, b, got, want; 279 1.1 mrg int l, i, ret; 280 1.1 mrg 281 1.1 mrg mpz_init (got); 282 1.1 mrg mpz_init (want); 283 1.1 mrg mpz_init_set_ui (a, 55); 284 1.1 mrg mpz_init_set_ui (b, 99); 285 1.1 mrg 286 1.1 mrg for (l = 0; l < numberof (list_z); l++) 287 1.1 mrg { 288 1.1 mrg data = list_z[l].data; 289 1.1 mrg 290 1.1 mrg for (i = 0; i < list_z[l].num; i++) 291 1.1 mrg { 292 1.1 mrg if (option_trace) 293 1.1 mrg printf ("mpz_expr \"%s\"\n", data[i].expr); 294 1.1 mrg 295 1.1 mrg ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL); 296 1.1 mrg 297 1.1 mrg if (data[i].want == NULL) 298 1.1 mrg { 299 1.1 mrg /* expect to fail */ 300 1.1 mrg if (ret == MPEXPR_RESULT_OK) 301 1.1 mrg { 302 1.1 mrg printf ("mpz_expr wrong return value, got %d, expected failure\n", ret); 303 1.1 mrg goto error; 304 1.1 mrg } 305 1.1 mrg } 306 1.1 mrg else 307 1.1 mrg { 308 1.1 mrg if (mpz_set_str (want, data[i].want, 0) != 0) 309 1.1 mrg { 310 1.1 mrg printf ("Cannot parse wanted value string\n"); 311 1.1 mrg goto error; 312 1.1 mrg } 313 1.1 mrg if (ret != MPEXPR_RESULT_OK) 314 1.1 mrg { 315 1.1 mrg printf ("mpz_expr failed unexpectedly\n"); 316 1.1 mrg printf (" return value %d\n", ret); 317 1.1 mrg goto error; 318 1.1 mrg } 319 1.1 mrg if (mpz_cmp (got, want) != 0) 320 1.1 mrg { 321 1.1 mrg printf ("mpz_expr wrong result\n"); 322 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, got); 323 1.1 mrg printf ("\n"); 324 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, want); 325 1.1 mrg printf ("\n"); 326 1.1 mrg goto error; 327 1.1 mrg } 328 1.1 mrg } 329 1.1 mrg } 330 1.1 mrg } 331 1.1 mrg mpz_clear (a); 332 1.1 mrg mpz_clear (b); 333 1.1 mrg mpz_clear (got); 334 1.1 mrg mpz_clear (want); 335 1.1 mrg return; 336 1.1 mrg 337 1.1 mrg error: 338 1.1 mrg printf (" base %d\n", data[i].base); 339 1.1 mrg printf (" expr \"%s\"\n", data[i].expr); 340 1.1 mrg if (data[i].want != NULL) 341 1.1 mrg printf (" want \"%s\"\n", data[i].want); 342 1.1 mrg abort (); 343 1.1 mrg } 344 1.1 mrg 345 1.1 mrg void 346 1.1 mrg check_q (void) 347 1.1 mrg { 348 1.1 mrg const struct data_t *data; 349 1.1 mrg mpq_t a, b, got, want; 350 1.1 mrg int l, i, ret; 351 1.1 mrg 352 1.1 mrg mpq_init (got); 353 1.1 mrg mpq_init (want); 354 1.1 mrg mpq_init (a); 355 1.1 mrg mpq_init (b); 356 1.1 mrg 357 1.1 mrg mpq_set_ui (a, 55, 1); 358 1.1 mrg mpq_set_ui (b, 99, 1); 359 1.1 mrg 360 1.1 mrg for (l = 0; l < numberof (list_q); l++) 361 1.1 mrg { 362 1.1 mrg data = list_q[l].data; 363 1.1 mrg 364 1.1 mrg for (i = 0; i < list_q[l].num; i++) 365 1.1 mrg { 366 1.1 mrg if (option_trace) 367 1.1 mrg printf ("mpq_expr \"%s\"\n", data[i].expr); 368 1.1 mrg 369 1.1 mrg ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL); 370 1.1 mrg 371 1.1 mrg if (data[i].want == NULL) 372 1.1 mrg { 373 1.1 mrg /* expect to fail */ 374 1.1 mrg if (ret == MPEXPR_RESULT_OK) 375 1.1 mrg { 376 1.1 mrg printf ("mpq_expr wrong return value, got %d, expected failure\n", ret); 377 1.1 mrg goto error; 378 1.1 mrg } 379 1.1 mrg } 380 1.1 mrg else 381 1.1 mrg { 382 1.1 mrg if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0) 383 1.1 mrg { 384 1.1 mrg printf ("Cannot parse wanted value string\n"); 385 1.1 mrg goto error; 386 1.1 mrg } 387 1.1 mrg mpz_set_ui (mpq_denref(want), 1); 388 1.1 mrg 389 1.1 mrg if (ret != MPEXPR_RESULT_OK) 390 1.1 mrg { 391 1.1 mrg printf ("mpq_expr failed unexpectedly\n"); 392 1.1 mrg printf (" return value %d\n", ret); 393 1.1 mrg goto error; 394 1.1 mrg } 395 1.1 mrg if (mpq_cmp (got, want) != 0) 396 1.1 mrg { 397 1.1 mrg printf ("mpq_expr wrong result\n"); 398 1.1 mrg printf (" got "); mpq_out_str (stdout, 10, got); 399 1.1 mrg printf ("\n"); 400 1.1 mrg printf (" want "); mpq_out_str (stdout, 10, want); 401 1.1 mrg printf ("\n"); 402 1.1 mrg goto error; 403 1.1 mrg } 404 1.1 mrg } 405 1.1 mrg } 406 1.1 mrg } 407 1.1 mrg mpq_clear (a); 408 1.1 mrg mpq_clear (b); 409 1.1 mrg mpq_clear (got); 410 1.1 mrg mpq_clear (want); 411 1.1 mrg return; 412 1.1 mrg 413 1.1 mrg error: 414 1.1 mrg printf (" base %d\n", data[i].base); 415 1.1 mrg printf (" expr \"%s\"\n", data[i].expr); 416 1.1 mrg if (data[i].want != NULL) 417 1.1 mrg printf (" want \"%s\"\n", data[i].want); 418 1.1 mrg abort (); 419 1.1 mrg } 420 1.1 mrg 421 1.1 mrg void 422 1.1 mrg check_f (void) 423 1.1 mrg { 424 1.1 mrg const struct data_t *data; 425 1.1 mrg mpf_t a, b, got, want; 426 1.1 mrg int l, i, ret; 427 1.1 mrg 428 1.1 mrg mpf_set_default_prec (200L); 429 1.1 mrg 430 1.1 mrg mpf_init (got); 431 1.1 mrg mpf_init (want); 432 1.1 mrg mpf_init_set_ui (a, 55); 433 1.1 mrg mpf_init_set_ui (b, 99); 434 1.1 mrg 435 1.1 mrg for (l = 0; l < numberof (list_f); l++) 436 1.1 mrg { 437 1.1 mrg data = list_f[l].data; 438 1.1 mrg 439 1.1 mrg for (i = 0; i < list_f[l].num; i++) 440 1.1 mrg { 441 1.1 mrg if (option_trace) 442 1.1 mrg printf ("mpf_expr \"%s\"\n", data[i].expr); 443 1.1 mrg 444 1.1 mrg ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL); 445 1.1 mrg 446 1.1 mrg if (data[i].want == NULL) 447 1.1 mrg { 448 1.1 mrg /* expect to fail */ 449 1.1 mrg if (ret == MPEXPR_RESULT_OK) 450 1.1 mrg { 451 1.1 mrg printf ("mpf_expr wrong return value, got %d, expected failure\n", ret); 452 1.1 mrg goto error; 453 1.1 mrg } 454 1.1 mrg } 455 1.1 mrg else 456 1.1 mrg { 457 1.1 mrg if (mpf_set_str (want, data[i].want, 0) != 0) 458 1.1 mrg { 459 1.1 mrg printf ("Cannot parse wanted value string\n"); 460 1.1 mrg goto error; 461 1.1 mrg } 462 1.1 mrg 463 1.1 mrg if (ret != MPEXPR_RESULT_OK) 464 1.1 mrg { 465 1.1 mrg printf ("mpf_expr failed unexpectedly\n"); 466 1.1 mrg printf (" return value %d\n", ret); 467 1.1 mrg goto error; 468 1.1 mrg } 469 1.1 mrg if (mpf_cmp (got, want) != 0) 470 1.1 mrg { 471 1.1 mrg printf ("mpf_expr wrong result\n"); 472 1.1 mrg printf (" got "); mpf_out_str (stdout, 10, 20, got); 473 1.1 mrg printf ("\n"); 474 1.1 mrg printf (" want "); mpf_out_str (stdout, 10, 20, want); 475 1.1 mrg printf ("\n"); 476 1.1 mrg goto error; 477 1.1 mrg } 478 1.1 mrg } 479 1.1 mrg } 480 1.1 mrg } 481 1.1 mrg mpf_clear (a); 482 1.1 mrg mpf_clear (b); 483 1.1 mrg mpf_clear (got); 484 1.1 mrg mpf_clear (want); 485 1.1 mrg return; 486 1.1 mrg 487 1.1 mrg error: 488 1.1 mrg printf (" base %d\n", data[i].base); 489 1.1 mrg printf (" expr \"%s\"\n", data[i].expr); 490 1.1 mrg if (data[i].want != NULL) 491 1.1 mrg printf (" want \"%s\"\n", data[i].want); 492 1.1 mrg abort (); 493 1.1 mrg } 494 1.1 mrg 495 1.1 mrg 496 1.1 mrg int 497 1.1 mrg main (int argc, char *argv[]) 498 1.1 mrg { 499 1.1 mrg tests_start (); 500 1.1 mrg 501 1.1 mrg if (argc >= 2) 502 1.1 mrg option_trace = 1; 503 1.1 mrg 504 1.1 mrg check_z (); 505 1.1 mrg check_q (); 506 1.1 mrg check_f (); 507 1.1 mrg 508 1.1 mrg tests_end (); 509 1.1 mrg exit (0); 510 1.1 mrg } 511