Annotation of OpenXM_contrib/gmp/demos/expr/t-expr.c, Revision 1.1
1.1 ! ohara 1: /* Test expression evaluation (print nothing and exit 0 if successful).
! 2:
! 3: Copyright 2000, 2001, 2002 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 2.1 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; see the file COPYING.LIB. If not, write to
! 19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: MA 02111-1307, USA. */
! 21:
! 22: #include <stdio.h>
! 23: #include <stdlib.h>
! 24:
! 25: #include "gmp.h"
! 26: #include "gmp-impl.h"
! 27: #include "tests.h"
! 28: #include "expr-impl.h"
! 29:
! 30: #if HAVE_MPFR
! 31: extern mpfr_t __mpfr_const_pi;
! 32: extern int __mpfr_const_pi_prec;
! 33: extern mpfr_t __mpfr_const_log2;
! 34: extern int __mpfr_const_log2_prec;
! 35: #endif
! 36:
! 37:
! 38: int option_trace = 0;
! 39:
! 40:
! 41: struct data_t {
! 42: int base;
! 43: const char *expr;
! 44: const char *want;
! 45: };
! 46:
! 47:
! 48: /* These data_xxx[] arrays are tables to be tested with one or more of the
! 49: mp?_t types. z=mpz_t, q=mpz_t, f=mpf_t, r=mpfr_t. */
! 50:
! 51: struct data_t data_zqfr[] = {
! 52:
! 53: /* various deliberately wrong expressions */
! 54: { 0, "", NULL },
! 55: { 0, "1+", NULL },
! 56: { 0, "+2", NULL },
! 57: { 0, "1,2", NULL },
! 58: { 0, "foo(1,2)", NULL },
! 59: { 0, "1+foo", NULL },
! 60: { 10, "0fff", NULL },
! 61: { 0, "!", NULL },
! 62: { 0, "10!", NULL },
! 63: { 0, "-10!", NULL },
! 64: { 0, "gcd((4,6))", NULL },
! 65: { 0, "()", NULL },
! 66: { 0, "fac(2**1000)", NULL },
! 67: { 0, "$", NULL },
! 68: { 0, "$-", NULL },
! 69:
! 70: /* some basics */
! 71: { 10, "123", "123" },
! 72: { 10, "-123", "-123" },
! 73: { 10, "1+2", "3" },
! 74: { 10, "1+2+3", "6" },
! 75: { 10, "1+2*3", "7" },
! 76: { 10, "3*2+1", "7" },
! 77: { 10, "$a", "55" },
! 78: { 10, "b", "99" },
! 79: { 16, "b", "11" },
! 80: { 10, "4**3 * 2 + 1", "129" },
! 81: { 10, "1<2", "1" },
! 82: { 10, "1>2", "0" },
! 83:
! 84: { 10, "(123)", "123" },
! 85:
! 86: { 10, "sgn(-123)", "-1" },
! 87: { 10, "5-7", "-2" },
! 88:
! 89: { 0, "cmp(0,0)", "0" },
! 90: { 0, "cmp(1,0)", "1" },
! 91: { 0, "cmp(0,1)", "-1" },
! 92: { 0, "cmp(-1,0)", "-1" },
! 93: { 0, "cmp(0,-1)", "1" },
! 94:
! 95: { 10, "0 ? 123 : 456", "456" },
! 96: { 10, "1 ? 4+5 : 6+7", "9" },
! 97:
! 98: { 10, "(123)", "123" },
! 99: { 10, "(2+3)", "5" },
! 100: { 10, "(4+5)*(5+6)", "99" },
! 101:
! 102: { 0, "1 << 16", "65536" },
! 103: { 0, "256 >> 4", "16" },
! 104: { 0, "-256 >> 4", "-16" },
! 105:
! 106: { 0, "!1", "0" },
! 107: { 0, "!9", "0" },
! 108: { 0, "!0", "1" },
! 109:
! 110: { 0, "2**2**2", "16" },
! 111: { 0, "-2**2**2", "-16" },
! 112:
! 113: { 0, "0x100", "256" },
! 114: { 10, "0x100", NULL },
! 115: { 10, "0x 100", NULL },
! 116:
! 117: { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" },
! 118: { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" },
! 119: { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" },
! 120:
! 121: { 10, "abs(123)", "123" },
! 122: { 10, "abs(-123)", "123" },
! 123: { 10, "abs(0)", "0" },
! 124:
! 125: /* filling data stack */
! 126: { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" },
! 127:
! 128: /* filling control stack */
! 129: { 0, "----------------------------------------------------1", "1" },
! 130: };
! 131:
! 132:
! 133: const struct data_t data_z[] = {
! 134: { 0, "cmpabs(0,0)", "0" },
! 135: { 0, "cmpabs(1,0)", "1" },
! 136: { 0, "cmpabs(0,1)", "-1" },
! 137: { 0, "cmpabs(-1,0)", "1" },
! 138: { 0, "cmpabs(0,-1)", "-1" },
! 139:
! 140: { 0, "divisible_p(333,3)", "1" },
! 141: { 0, "congruent_p(7,1,3)", "1" },
! 142:
! 143: { 0, "odd_p(1)", "1" },
! 144: { 0, "odd_p(0)", "0" },
! 145: { 0, "odd_p(-1)", "1" },
! 146:
! 147: { 0, "even_p(1)", "0" },
! 148: { 0, "even_p(0)", "1" },
! 149: { 0, "even_p(-1)", "0" },
! 150:
! 151: { 10, "root(81,4)", "3" },
! 152:
! 153: { 10, "gcd(4,6)", "2" },
! 154: { 10, "gcd(4,6,9)", "1" },
! 155:
! 156: { 10, "powm(3,2,9)", "0" },
! 157: { 10, "powm(3,2,8)", "1" },
! 158:
! 159: /* filling data stack */
! 160: { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" },
! 161:
! 162: /* filling control stack */
! 163: { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" },
! 164:
! 165: { 0, "fib(10)", "55" },
! 166:
! 167: { 0, "setbit(0,5)", "32" },
! 168: { 0, "clrbit(32,5)", "0" },
! 169: { 0, "tstbit(32,5)", "1" },
! 170: { 0, "tstbit(32,4)", "0" },
! 171: { 0, "scan0(7,0)", "3" },
! 172: { 0, "scan1(7,0)", "0" },
! 173: };
! 174:
! 175: const struct data_t data_zq[] = {
! 176: /* expecting failure */
! 177: { 0, "1.2", NULL },
! 178: };
! 179:
! 180: const struct data_t data_zr[] = {
! 181: { 0, "fac(0)", "1" },
! 182: { 0, "fac(1)", "1" },
! 183: { 0, "fac(2)", "2" },
! 184: { 0, "fac(3)", "6" },
! 185: { 0, "fac(10)", "3628800" },
! 186: };
! 187:
! 188: const struct data_t data_q[] = {
! 189: { 10, "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" },
! 190: { 0, "num(5/9)", "5" },
! 191: { 0, "den(5/9)", "9" },
! 192: };
! 193:
! 194: const struct data_t data_zfr[] = {
! 195: { 10, "sqrt ( 49 )", "7" },
! 196: { 10, "sqrt ( 49 ) + 1", "8" },
! 197: { 10, "sqrt((49))", "7" },
! 198: { 10, "sqrt((((((((49))))))))", "7" },
! 199: };
! 200:
! 201: const struct data_t data_fr[] = {
! 202: { 0, "1@10", "10000000000" },
! 203: { 0, "1.5@10", "15000000000" },
! 204: { 0, "1000@-1", "100" },
! 205: { 0, "10.00@-1", "1" },
! 206:
! 207: { 0, "1e10", "10000000000" },
! 208: { 0, "1.5e10", "15000000000" },
! 209: { 0, "1000e-1", "100" },
! 210: { 0, "10.00e-1", "1" },
! 211:
! 212: { 16, "1@9", "68719476736" },
! 213:
! 214: { 0, "ceil(0)", "0" },
! 215: { 0, "ceil(0.25)", "1" },
! 216: { 0, "ceil(0.5)", "1" },
! 217: { 0, "ceil(1.5)", "2" },
! 218: { 0, "ceil(-0.5)", "0" },
! 219: { 0, "ceil(-1.5)", "-1" },
! 220:
! 221: /* only simple cases because mpf_eq currently only works on whole limbs */
! 222: { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" },
! 223: { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" },
! 224:
! 225: { 0, "floor(0)", "0" },
! 226: { 0, "floor(0.25)", "0" },
! 227: { 0, "floor(0.5)", "0" },
! 228: { 0, "floor(1.5)", "1" },
! 229: { 0, "floor(-0.5)", "-1" },
! 230: { 0, "floor(-1.5)", "-2" },
! 231:
! 232: { 0, "trunc(0)", "0" },
! 233: { 0, "trunc(0.25)", "0" },
! 234: { 0, "trunc(0.5)", "0" },
! 235: { 0, "trunc(1.5)", "1" },
! 236: { 0, "trunc(-0.5)", "0" },
! 237: { 0, "trunc(-1.5)", "-1" },
! 238:
! 239: };
! 240:
! 241: const struct data_t data_f[] = {
! 242: { 16, "1@10", "18446744073709551616" },
! 243: { -16, "1@10", "1099511627776" },
! 244:
! 245: { 0, "integer_p(1)", "1" },
! 246: { 0, "integer_p(0.5)", "0" },
! 247: };
! 248:
! 249: const struct data_t data_r[] = {
! 250: { 16, "1@10", "1099511627776" },
! 251:
! 252: { 0, "euler", "" },
! 253: { 0, "euler+1", "" },
! 254:
! 255: { 0, "loge2", "" },
! 256: { 0, "loge2+1", "" },
! 257:
! 258: { 0, "pi", "" },
! 259: { 0, "2*pi", "" },
! 260: { 0, "pi()", NULL },
! 261: { 0, "2 + pi() * 4", NULL },
! 262:
! 263: { 0, "acos(0)-pi/2", "~0" },
! 264: { 0, "acos(1)", "0" },
! 265:
! 266: { 0, "agm(0,0)", "0" },
! 267: { 0, "agm(1,1)", "1" },
! 268:
! 269: { 0, "asin(0)", "0" },
! 270: { 0, "asin(1)-pi/2", "~0" },
! 271:
! 272: { 0, "atan(0)", "0" },
! 273: { 0, "atan(1)-pi/4", "~0" },
! 274: { 0, "atan(-1)+pi/4", "~0" },
! 275:
! 276: { 0, "cos(0)", "1" },
! 277: { 0, "cos(pi/2)", "~0" },
! 278: { 0, "cos(pi)", "~-1" },
! 279: { 0, "cos(3*pi/2)", "~0" },
! 280: { 0, "cos(2*pi)", "~1" },
! 281:
! 282: { 0, "cosh(0)", "1" },
! 283:
! 284: { 0, "dim(0,0)", "0" },
! 285: { 0, "dim(2,0)", "2" },
! 286: { 0, "dim(3,1)", "2" },
! 287: { 0, "dim(1,3)", "0" },
! 288: { 0, "dim(-2,0)", "0" },
! 289: { 0, "dim(-3,-1)", "0" },
! 290: { 0, "dim(-1,-3)", "2" },
! 291:
! 292: { 0, "eq(0xFF,0xF0,4)", "1" },
! 293: { 0, "eq(0xFF,0xF0,5)", "0" },
! 294:
! 295: { 0, "exp(0)", "1" },
! 296: { 0, "expm1(0)", "0" },
! 297:
! 298: { 0, "fma(2,3,4)", "10" },
! 299: { 0, "fma(-2,3,4)", "-2" },
! 300: { 0, "fma(2,-3,4)", "-2" },
! 301: { 0, "fma(2,-3,-4)", "-10" },
! 302:
! 303: { 0, "hypot(3,4)", "5" },
! 304:
! 305: { 0, "inf_p(1)", "0" },
! 306: { 0, "inf_p(-1)", "0" },
! 307: { 0, "inf_p(1/0)", "1" },
! 308: { 0, "inf_p(sqrt(-1))", "0" },
! 309: { 0, "inf_p(1)", "0" },
! 310: { 0, "inf_p(nan)", "0" },
! 311: { 0, "inf_p(inf)", "1" },
! 312: { 0, "inf_p(-inf)", "1" },
! 313:
! 314: { 0, "inf > 0", "1" },
! 315: { 0, "inf == 0", "0" },
! 316: { 0, "inf < 0", "0" },
! 317: { 0, "-inf > 0", "0" },
! 318: { 0, "-inf == 0", "0" },
! 319: { 0, "-inf < 0", "1" },
! 320: { 0, "inf == inf", "1" },
! 321: { 0, "inf != inf", "0" },
! 322: { 0, "inf == -inf", "0" },
! 323: { 0, "inf != -inf", "1" },
! 324:
! 325: { 0, "nan_p(log(-1))", "1" },
! 326: { 0, "inf_p(log(0))", "1" },
! 327: { 0, "log(0) == -inf", "1" },
! 328: { 0, "log(1)", "~0" },
! 329:
! 330: { 0, "inf_p(log2(0))", "1" },
! 331: { 0, "log2(1)", "0" },
! 332: { 0, "log2(2)", "1" },
! 333: { 0, "log2(4)", "2" },
! 334: { 0, "log2(8)", "3" },
! 335:
! 336: { 0, "inf_p(log10(0))", "1" },
! 337: { 0, "log10(1)", "0" },
! 338: { 0, "log10(10)", "1" },
! 339: { 0, "log10(100)", "2" },
! 340: { 0, "log10(1000)", "3" },
! 341:
! 342: { 0, "log1p(0)", "0" },
! 343:
! 344: { 0, "nan_p(-1)", "0" },
! 345: { 0, "nan_p(1/0)", "0" },
! 346: { 0, "nan_p(sqrt(-1))", "1" },
! 347: { 0, "nan_p(1)", "0" },
! 348: { 0, "nan_p(nan)", "1" },
! 349: { 0, "nan_p(inf)", "0" },
! 350: { 0, "nan_p(-inf)", "0" },
! 351:
! 352: { 0, "number_p(-1)", "1" },
! 353: { 0, "number_p(1/0)", "0" },
! 354: { 0, "number_p(sqrt(-1))", "0" },
! 355: { 0, "number_p(1)", "1" },
! 356: { 0, "number_p(nan)", "0" },
! 357: { 0, "number_p(inf)", "0" },
! 358: { 0, "number_p(-inf)", "0" },
! 359:
! 360: { 0, "round(0)", "0" },
! 361: { 0, "round(0.25)", "0" },
! 362: { 0, "round(0.5)", "1" },
! 363: { 0, "round(1.5)", "2" },
! 364: { 0, "round(-0.5)", "-1" },
! 365: { 0, "round(-1.5)", "-2" },
! 366:
! 367: { 0, "sin(0)", "0" },
! 368: { 0, "sin(pi/2)", "~1" },
! 369: { 0, "sin(pi)", "~0" },
! 370: { 0, "sin(3*pi/2)", "~-1" },
! 371: { 0, "sin(2*pi)", "~0" },
! 372:
! 373: { 0, "sinh(0)", "0" },
! 374:
! 375: { 0, "tan(0)", "0" },
! 376: { 0, "tan(pi/4)", "~1" },
! 377: { 0, "tan(3*pi/4)", "~-1" },
! 378: { 0, "tan(pi)", "~0" },
! 379: { 0, "tan(5*pi/4)", "~1" },
! 380: { 0, "tan(7*pi/4)", "~-1" },
! 381:
! 382: { 0, "tan(0)", "0" },
! 383: };
! 384:
! 385: struct datalist_t {
! 386: const struct data_t *data;
! 387: int num;
! 388: };
! 389:
! 390: #define DATALIST(data) { data, numberof (data) }
! 391:
! 392: struct datalist_t list_z[] = {
! 393: DATALIST (data_z),
! 394: DATALIST (data_zq),
! 395: DATALIST (data_zfr),
! 396: DATALIST (data_zqfr),
! 397: DATALIST (data_zr),
! 398: };
! 399:
! 400: struct datalist_t list_q[] = {
! 401: DATALIST (data_q),
! 402: DATALIST (data_zq),
! 403: DATALIST (data_zqfr),
! 404: };
! 405:
! 406: struct datalist_t list_f[] = {
! 407: DATALIST (data_zfr),
! 408: DATALIST (data_zqfr),
! 409: DATALIST (data_fr),
! 410: DATALIST (data_f),
! 411: };
! 412:
! 413: struct datalist_t list_r[] = {
! 414: DATALIST (data_zfr),
! 415: DATALIST (data_zqfr),
! 416: DATALIST (data_zr),
! 417: DATALIST (data_fr),
! 418: DATALIST (data_r),
! 419: };
! 420:
! 421:
! 422: void
! 423: check_z (void)
! 424: {
! 425: const struct data_t *data;
! 426: mpz_t a, b, got, want;
! 427: int l, i, ret;
! 428:
! 429: mpz_init (got);
! 430: mpz_init (want);
! 431: mpz_init_set_ui (a, 55);
! 432: mpz_init_set_ui (b, 99);
! 433:
! 434: for (l = 0; l < numberof (list_z); l++)
! 435: {
! 436: data = list_z[l].data;
! 437:
! 438: for (i = 0; i < list_z[l].num; i++)
! 439: {
! 440: if (option_trace)
! 441: printf ("mpz_expr \"%s\"\n", data[i].expr);
! 442:
! 443: ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL);
! 444:
! 445: if (data[i].want == NULL)
! 446: {
! 447: /* expect to fail */
! 448: if (ret == MPEXPR_RESULT_OK)
! 449: {
! 450: printf ("mpz_expr wrong return value, got %d, expected failure\n", ret);
! 451: goto error;
! 452: }
! 453: }
! 454: else
! 455: {
! 456: if (mpz_set_str (want, data[i].want, 0) != 0)
! 457: {
! 458: printf ("Cannot parse wanted value string\n");
! 459: goto error;
! 460: }
! 461: if (ret != MPEXPR_RESULT_OK)
! 462: {
! 463: printf ("mpz_expr failed unexpectedly\n");
! 464: printf (" return value %d\n", ret);
! 465: goto error;
! 466: }
! 467: if (mpz_cmp (got, want) != 0)
! 468: {
! 469: printf ("mpz_expr wrong result\n");
! 470: printf (" got "); mpz_out_str (stdout, 10, got);
! 471: printf ("\n");
! 472: printf (" want "); mpz_out_str (stdout, 10, want);
! 473: printf ("\n");
! 474: goto error;
! 475: }
! 476: }
! 477: }
! 478: }
! 479: mpz_clear (a);
! 480: mpz_clear (b);
! 481: mpz_clear (got);
! 482: mpz_clear (want);
! 483: return;
! 484:
! 485: error:
! 486: printf (" base %d\n", data[i].base);
! 487: printf (" expr \"%s\"\n", data[i].expr);
! 488: if (data[i].want != NULL)
! 489: printf (" want \"%s\"\n", data[i].want);
! 490: abort ();
! 491: }
! 492:
! 493: void
! 494: check_q (void)
! 495: {
! 496: const struct data_t *data;
! 497: mpq_t a, b, got, want;
! 498: int l, i, ret;
! 499:
! 500: mpq_init (got);
! 501: mpq_init (want);
! 502: mpq_init (a);
! 503: mpq_init (b);
! 504:
! 505: mpq_set_ui (a, 55, 1);
! 506: mpq_set_ui (b, 99, 1);
! 507:
! 508: for (l = 0; l < numberof (list_q); l++)
! 509: {
! 510: data = list_q[l].data;
! 511:
! 512: for (i = 0; i < list_q[l].num; i++)
! 513: {
! 514: if (option_trace)
! 515: printf ("mpq_expr \"%s\"\n", data[i].expr);
! 516:
! 517: ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL);
! 518:
! 519: if (data[i].want == NULL)
! 520: {
! 521: /* expect to fail */
! 522: if (ret == MPEXPR_RESULT_OK)
! 523: {
! 524: printf ("mpq_expr wrong return value, got %d, expected failure\n", ret);
! 525: goto error;
! 526: }
! 527: }
! 528: else
! 529: {
! 530: if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0)
! 531: {
! 532: printf ("Cannot parse wanted value string\n");
! 533: goto error;
! 534: }
! 535: mpz_set_ui (mpq_denref(want), 1);
! 536:
! 537: if (ret != MPEXPR_RESULT_OK)
! 538: {
! 539: printf ("mpq_expr failed unexpectedly\n");
! 540: printf (" return value %d\n", ret);
! 541: goto error;
! 542: }
! 543: if (mpq_cmp (got, want) != 0)
! 544: {
! 545: printf ("mpq_expr wrong result\n");
! 546: printf (" got "); mpq_out_str (stdout, 10, got);
! 547: printf ("\n");
! 548: printf (" want "); mpq_out_str (stdout, 10, want);
! 549: printf ("\n");
! 550: goto error;
! 551: }
! 552: }
! 553: }
! 554: }
! 555: mpq_clear (a);
! 556: mpq_clear (b);
! 557: mpq_clear (got);
! 558: mpq_clear (want);
! 559: return;
! 560:
! 561: error:
! 562: printf (" base %d\n", data[i].base);
! 563: printf (" expr \"%s\"\n", data[i].expr);
! 564: if (data[i].want != NULL)
! 565: printf (" want \"%s\"\n", data[i].want);
! 566: abort ();
! 567: }
! 568:
! 569: void
! 570: check_f (void)
! 571: {
! 572: const struct data_t *data;
! 573: mpf_t a, b, got, want;
! 574: int l, i, ret;
! 575:
! 576: mpf_set_default_prec (200L);
! 577:
! 578: mpf_init (got);
! 579: mpf_init (want);
! 580: mpf_init_set_ui (a, 55);
! 581: mpf_init_set_ui (b, 99);
! 582:
! 583: for (l = 0; l < numberof (list_f); l++)
! 584: {
! 585: data = list_f[l].data;
! 586:
! 587: for (i = 0; i < list_f[l].num; i++)
! 588: {
! 589: if (option_trace)
! 590: printf ("mpf_expr \"%s\"\n", data[i].expr);
! 591:
! 592: ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL);
! 593:
! 594: if (data[i].want == NULL)
! 595: {
! 596: /* expect to fail */
! 597: if (ret == MPEXPR_RESULT_OK)
! 598: {
! 599: printf ("mpf_expr wrong return value, got %d, expected failure\n", ret);
! 600: goto error;
! 601: }
! 602: }
! 603: else
! 604: {
! 605: if (mpf_set_str (want, data[i].want, 0) != 0)
! 606: {
! 607: printf ("Cannot parse wanted value string\n");
! 608: goto error;
! 609: }
! 610:
! 611: if (ret != MPEXPR_RESULT_OK)
! 612: {
! 613: printf ("mpf_expr failed unexpectedly\n");
! 614: printf (" return value %d\n", ret);
! 615: goto error;
! 616: }
! 617: if (mpf_cmp (got, want) != 0)
! 618: {
! 619: printf ("mpf_expr wrong result\n");
! 620: printf (" got "); mpf_out_str (stdout, 10, 20, got);
! 621: printf ("\n");
! 622: printf (" want "); mpf_out_str (stdout, 10, 20, want);
! 623: printf ("\n");
! 624: goto error;
! 625: }
! 626: }
! 627: }
! 628: }
! 629: mpf_clear (a);
! 630: mpf_clear (b);
! 631: mpf_clear (got);
! 632: mpf_clear (want);
! 633: return;
! 634:
! 635: error:
! 636: printf (" base %d\n", data[i].base);
! 637: printf (" expr \"%s\"\n", data[i].expr);
! 638: if (data[i].want != NULL)
! 639: printf (" want \"%s\"\n", data[i].want);
! 640: abort ();
! 641: }
! 642:
! 643: #if HAVE_MPFR
! 644: void
! 645: check_r (void)
! 646: {
! 647: const struct data_t *data;
! 648: mpfr_t a, b, got, want, diff, tolerance;
! 649: int l, i, ret;
! 650:
! 651: mpfr_set_default_prec (300L);
! 652:
! 653: mpfr_init (got);
! 654: mpfr_init (want);
! 655: mpfr_init (diff);
! 656: mpfr_init (tolerance);
! 657: mpfr_init (a);
! 658: mpfr_init (b);
! 659: mpfr_set_ui (a, 55L, GMP_RNDZ);
! 660: mpfr_set_ui (b, 99L, GMP_RNDZ);
! 661:
! 662: mpfr_set_ui (tolerance, 1L, GMP_RNDZ);
! 663: mpfr_div_2exp (tolerance, tolerance, 190L, GMP_RNDZ);
! 664:
! 665: for (l = 0; l < numberof (list_r); l++)
! 666: {
! 667: data = list_r[l].data;
! 668:
! 669: for (i = 0; i < list_r[l].num; i++)
! 670: {
! 671: if (option_trace)
! 672: printf ("mpfr_expr \"%s\"\n", data[i].expr);
! 673:
! 674: ret = mpfr_expr (got, data[i].base, data[i].expr, a, b, NULL);
! 675:
! 676: if (data[i].want == NULL)
! 677: {
! 678: /* expect to fail */
! 679: if (ret == MPEXPR_RESULT_OK)
! 680: {
! 681: printf ("mpfr_expr wrong return value, got %d, expected failure\n", ret);
! 682: goto error;
! 683: }
! 684: }
! 685: else
! 686: {
! 687: if (ret != MPEXPR_RESULT_OK)
! 688: {
! 689: printf ("mpfr_expr failed unexpectedly\n");
! 690: printf (" return value %d\n", ret);
! 691: goto error;
! 692: }
! 693:
! 694: /* empty string means don't check the result value as such */
! 695: if (data[i].want[0] != '\0')
! 696: {
! 697: const char *want_str = data[i].want;
! 698: int approx = (*want_str == '~');
! 699: want_str += approx;
! 700: if (mpfr_set_str (want, want_str, 10, GMP_RNDZ) != 0)
! 701: {
! 702: printf ("Cannot parse wanted value string\n");
! 703: printf (" \"%s\"\n", want_str);
! 704: goto error;
! 705: }
! 706: if (approx)
! 707: {
! 708: mpfr_sub (diff, got, want, GMP_RNDZ);
! 709: mpfr_abs (diff, diff, GMP_RNDZ);
! 710: if (mpfr_cmp (diff, tolerance) >= 0)
! 711: {
! 712: printf ("mpfr_expr result outside tolerance\n");
! 713: printf (" \"%s\"\n", data[i].expr);
! 714: printf (" got ");
! 715: mpfr_out_str (stdout, 10, 0, got, GMP_RNDZ);
! 716: printf ("\n");
! 717: printf (" want ");
! 718: mpfr_out_str (stdout, 10, 0, want, GMP_RNDZ);
! 719: printf ("\n");
! 720: printf (" diff ");
! 721: mpfr_out_str (stdout, 10, 0, diff, GMP_RNDZ);
! 722: printf ("\n");
! 723: goto error;
! 724: }
! 725: }
! 726: else
! 727: {
! 728: if (mpfr_cmp (got, want) != 0)
! 729: {
! 730: printf ("mpfr_expr wrong result\n");
! 731: printf (" \"%s\"\n", data[i].expr);
! 732: printf (" got ");
! 733: mpfr_out_str (stdout, 10, 20, got, GMP_RNDZ);
! 734: printf ("\n");
! 735: printf (" want ");
! 736: mpfr_out_str (stdout, 10, 20, want, GMP_RNDZ);
! 737: printf ("\n");
! 738: goto error;
! 739: }
! 740: }
! 741: }
! 742: }
! 743: }
! 744: }
! 745: mpfr_clear (a);
! 746: mpfr_clear (b);
! 747: mpfr_clear (got);
! 748: mpfr_clear (want);
! 749: mpfr_clear (diff);
! 750: mpfr_clear (tolerance);
! 751:
! 752: if (__mpfr_const_pi_prec != 0)
! 753: {
! 754: mpfr_clear (__mpfr_const_pi);
! 755: __mpfr_const_pi_prec = 0;
! 756: }
! 757: if (__mpfr_const_log2_prec != 0)
! 758: {
! 759: mpfr_clear (__mpfr_const_log2);
! 760: __mpfr_const_log2_prec = 0;
! 761: }
! 762:
! 763: return;
! 764:
! 765: error:
! 766: printf (" base %d\n", data[i].base);
! 767: printf (" expr \"%s\"\n", data[i].expr);
! 768: if (data[i].want != NULL)
! 769: printf (" want \"%s\"\n", data[i].want);
! 770: abort ();
! 771: }
! 772: #endif
! 773:
! 774:
! 775: int
! 776: main (int argc, char *argv[])
! 777: {
! 778: tests_start ();
! 779:
! 780: if (argc >= 2)
! 781: option_trace = 1;
! 782:
! 783: check_z ();
! 784: check_q ();
! 785: check_f ();
! 786: #if HAVE_MPFR
! 787: check_r ();
! 788: #endif
! 789:
! 790: tests_end ();
! 791: exit (0);
! 792: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>