Annotation of OpenXM_contrib/gmp/demos/expr/exprfr.c, Revision 1.1
1.1 ! ohara 1: /* mpfr expression evaluation.
! 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 "gmp.h"
! 24: #include "expr-impl.h"
! 25:
! 26:
! 27: /* Change this to "#define TRACE(x) x" to get some traces. */
! 28: #define TRACE(x)
! 29:
! 30:
! 31: /* This set of functions makes it possible to add the ROUND parameter, and a
! 32: few of the mpfr's are macros and need a wrapper anyway.
! 33:
! 34: A whole new set of functions like this just to add a rounding parameter
! 35: is a bit horrible, but it's the easiest way. There doesn't seem much use
! 36: having rounding passed down through mpfr_expr_a, since a single rounding
! 37: for all operations in an expression doesn't give close enough control to
! 38: be useful. */
! 39:
! 40: static void
! 41: e_mpfr_abs (mpfr_ptr dst, mpfr_srcptr src)
! 42: {
! 43: mpfr_abs (dst, src, ROUND);
! 44: }
! 45:
! 46: static void
! 47: e_mpfr_acos (mpfr_ptr dst, mpfr_srcptr src)
! 48: {
! 49: mpfr_acos (dst, src, ROUND);
! 50: }
! 51:
! 52: static void
! 53: e_mpfr_add (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 54: {
! 55: mpfr_add (dst, src1, src2, ROUND);
! 56: }
! 57:
! 58: static void
! 59: e_mpfr_agm (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 60: {
! 61: mpfr_agm (dst, src1, src2, ROUND);
! 62: }
! 63:
! 64: static void
! 65: e_mpfr_asin (mpfr_ptr dst, mpfr_srcptr src)
! 66: {
! 67: mpfr_asin (dst, src, ROUND);
! 68: }
! 69:
! 70: static void
! 71: e_mpfr_atan (mpfr_ptr dst, mpfr_srcptr src)
! 72: {
! 73: mpfr_atan (dst, src, ROUND);
! 74: }
! 75:
! 76: /* because mpfr_cmp is a macro */
! 77: static int
! 78: e_mpfr_cmp (mpfr_srcptr x, mpfr_srcptr y)
! 79: {
! 80: return mpfr_cmp (x, y);
! 81: }
! 82:
! 83: static void
! 84: e_mpfr_dim (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 85: {
! 86: mpfr_dim (dst, src1, src2, ROUND);
! 87: }
! 88:
! 89: static void
! 90: e_mpfr_const_euler (mpfr_ptr dst)
! 91: {
! 92: mpfr_const_euler (dst, ROUND);
! 93: }
! 94:
! 95: static void
! 96: e_mpfr_fac_ui (mpfr_ptr dst, unsigned long n)
! 97: {
! 98: mpfr_fac_ui (dst, n, ROUND);
! 99: }
! 100:
! 101: static void
! 102: e_mpfr_const_log2 (mpfr_ptr dst)
! 103: {
! 104: mpfr_const_log2 (dst, ROUND);
! 105: }
! 106:
! 107: static void
! 108: e_mpfr_const_pi (mpfr_ptr dst)
! 109: {
! 110: mpfr_const_pi (dst, ROUND);
! 111: }
! 112:
! 113: static void
! 114: e_mpfr_cos (mpfr_ptr dst, mpfr_srcptr src)
! 115: {
! 116: mpfr_cos (dst, src, ROUND);
! 117: }
! 118:
! 119: static void
! 120: e_mpfr_cosh (mpfr_ptr dst, mpfr_srcptr src)
! 121: {
! 122: mpfr_cosh (dst, src, ROUND);
! 123: }
! 124:
! 125: static void
! 126: e_mpfr_div (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 127: {
! 128: mpfr_div (dst, src1, src2, ROUND);
! 129: }
! 130:
! 131: static void
! 132: e_mpfr_div_2exp (mpfr_ptr dst, mpfr_srcptr src, unsigned long n)
! 133: {
! 134: mpfr_div_2exp (dst, src, n, ROUND);
! 135: }
! 136:
! 137: static void
! 138: e_mpfr_exp (mpfr_ptr dst, mpfr_srcptr src)
! 139: {
! 140: mpfr_exp (dst, src, ROUND);
! 141: }
! 142:
! 143: static void
! 144: e_mpfr_expm1 (mpfr_ptr dst, mpfr_srcptr src)
! 145: {
! 146: mpfr_expm1 (dst, src, ROUND);
! 147: }
! 148:
! 149: static void
! 150: e_mpfr_fma (mpfr_ptr w, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z)
! 151: {
! 152: mpfr_fma (w, x, y, z, ROUND);
! 153: }
! 154:
! 155: static void
! 156: e_mpfr_hypot (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 157: {
! 158: mpfr_hypot (dst, src1, src2, ROUND);
! 159: }
! 160:
! 161: static void
! 162: e_mpfr_log (mpfr_ptr dst, mpfr_srcptr src)
! 163: {
! 164: mpfr_log (dst, src, ROUND);
! 165: }
! 166:
! 167: static void
! 168: e_mpfr_log2 (mpfr_ptr dst, mpfr_srcptr src)
! 169: {
! 170: mpfr_log2 (dst, src, ROUND);
! 171: }
! 172:
! 173: static void
! 174: e_mpfr_log10 (mpfr_ptr dst, mpfr_srcptr src)
! 175: {
! 176: mpfr_log10 (dst, src, ROUND);
! 177: }
! 178:
! 179: static void
! 180: e_mpfr_log1p (mpfr_ptr dst, mpfr_srcptr src)
! 181: {
! 182: mpfr_log1p (dst, src, ROUND);
! 183: }
! 184:
! 185: static void
! 186: e_mpfr_mul (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 187: {
! 188: mpfr_mul (dst, src1, src2, ROUND);
! 189: }
! 190:
! 191: static void
! 192: e_mpfr_mul_2exp (mpfr_ptr dst, mpfr_srcptr src, unsigned long n)
! 193: {
! 194: mpfr_mul_2exp (dst, src, n, ROUND);
! 195: }
! 196:
! 197: static void
! 198: e_mpfr_neg (mpfr_ptr dst, mpfr_srcptr src)
! 199: {
! 200: mpfr_neg (dst, src, ROUND);
! 201: }
! 202:
! 203: static void
! 204: e_mpfr_pow_ui (mpfr_ptr p, mpfr_srcptr b, unsigned long e)
! 205: {
! 206: mpfr_pow_ui (p, b, e, ROUND);
! 207: }
! 208:
! 209: static void
! 210: e_mpfr_reldiff (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 211: {
! 212: mpfr_reldiff (dst, src1, src2, ROUND);
! 213: }
! 214:
! 215: static void
! 216: e_mpfr_set_posinf (mpfr_ptr dst)
! 217: {
! 218: mpfr_set_inf (dst, 1);
! 219: }
! 220:
! 221: static void
! 222: e_mpfr_sin (mpfr_ptr dst, mpfr_srcptr src)
! 223: {
! 224: mpfr_sin (dst, src, ROUND);
! 225: }
! 226:
! 227: static void
! 228: e_mpfr_sinh (mpfr_ptr dst, mpfr_srcptr src)
! 229: {
! 230: mpfr_sinh (dst, src, ROUND);
! 231: }
! 232:
! 233: static int
! 234: e_mpfr_sgn (mpfr_srcptr x)
! 235: {
! 236: return mpfr_sgn (x);
! 237: }
! 238:
! 239: static void
! 240: e_mpfr_sqrt (mpfr_ptr dst, mpfr_srcptr src)
! 241: {
! 242: mpfr_sqrt (dst, src, ROUND);
! 243: }
! 244:
! 245: static void
! 246: e_mpfr_sub (mpfr_ptr dst, mpfr_srcptr src1, mpfr_srcptr src2)
! 247: {
! 248: mpfr_sub (dst, src1, src2, ROUND);
! 249: }
! 250:
! 251: static void
! 252: e_mpfr_tan (mpfr_ptr dst, mpfr_srcptr src)
! 253: {
! 254: mpfr_tan (dst, src, ROUND);
! 255: }
! 256:
! 257: static void
! 258: e_mpfr_tanh (mpfr_ptr dst, mpfr_srcptr src)
! 259: {
! 260: mpfr_tanh (dst, src, ROUND);
! 261: }
! 262:
! 263:
! 264: static __gmp_const struct mpexpr_operator_t _mpfr_expr_standard_table[] = {
! 265:
! 266: { "**", (mpexpr_fun_t) e_mpfr_pow_ui,
! 267: MPEXPR_TYPE_BINARY_UI | MPEXPR_TYPE_RIGHTASSOC, 220 },
! 268:
! 269: { "!", (mpexpr_fun_t) e_mpfr_sgn,
! 270: MPEXPR_TYPE_LOGICAL_NOT | MPEXPR_TYPE_PREFIX, 210 },
! 271: { "-", (mpexpr_fun_t) e_mpfr_neg,
! 272: MPEXPR_TYPE_UNARY | MPEXPR_TYPE_PREFIX, 210 },
! 273:
! 274: { "*", (mpexpr_fun_t) e_mpfr_mul, MPEXPR_TYPE_BINARY, 200 },
! 275: { "/", (mpexpr_fun_t) e_mpfr_div, MPEXPR_TYPE_BINARY, 200 },
! 276:
! 277: { "+", (mpexpr_fun_t) e_mpfr_add, MPEXPR_TYPE_BINARY, 190 },
! 278: { "-", (mpexpr_fun_t) e_mpfr_sub, MPEXPR_TYPE_BINARY, 190 },
! 279:
! 280: { "<<", (mpexpr_fun_t) e_mpfr_mul_2exp, MPEXPR_TYPE_BINARY_UI, 180 },
! 281: { ">>", (mpexpr_fun_t) e_mpfr_div_2exp, MPEXPR_TYPE_BINARY_UI, 180 },
! 282:
! 283: { "<=", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_LE, 170 },
! 284: { "<", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_LT, 170 },
! 285: { ">=", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_GE, 170 },
! 286: { ">", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_GT, 170 },
! 287:
! 288: { "==", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_EQ, 160 },
! 289: { "!=", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_CMP_NE, 160 },
! 290:
! 291: { "&&", (mpexpr_fun_t) e_mpfr_sgn, MPEXPR_TYPE_LOGICAL_AND, 120 },
! 292: { "||", (mpexpr_fun_t) e_mpfr_sgn, MPEXPR_TYPE_LOGICAL_OR, 110 },
! 293:
! 294: { ":", NULL, MPEXPR_TYPE_COLON, 101 },
! 295: { "?", (mpexpr_fun_t) e_mpfr_sgn, MPEXPR_TYPE_QUESTION, 100 },
! 296:
! 297: { ")", NULL, MPEXPR_TYPE_CLOSEPAREN, 4 },
! 298: { "(", NULL, MPEXPR_TYPE_OPENPAREN, 3 },
! 299: { ",", NULL, MPEXPR_TYPE_ARGSEP, 2 },
! 300: { "$", NULL, MPEXPR_TYPE_VARIABLE, 1 },
! 301:
! 302: { "abs", (mpexpr_fun_t) e_mpfr_abs, MPEXPR_TYPE_UNARY },
! 303: { "acos", (mpexpr_fun_t) e_mpfr_acos, MPEXPR_TYPE_UNARY },
! 304: { "agm", (mpexpr_fun_t) e_mpfr_agm, MPEXPR_TYPE_BINARY },
! 305: { "asin", (mpexpr_fun_t) e_mpfr_asin, MPEXPR_TYPE_UNARY },
! 306: { "atan", (mpexpr_fun_t) e_mpfr_atan, MPEXPR_TYPE_UNARY },
! 307: { "ceil", (mpexpr_fun_t) mpfr_ceil, MPEXPR_TYPE_UNARY },
! 308: { "cmp", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_I_BINARY },
! 309: { "cos", (mpexpr_fun_t) e_mpfr_cos, MPEXPR_TYPE_UNARY },
! 310: { "cosh", (mpexpr_fun_t) e_mpfr_cosh, MPEXPR_TYPE_UNARY },
! 311: { "dim", (mpexpr_fun_t) e_mpfr_dim, MPEXPR_TYPE_BINARY },
! 312: { "eq", (mpexpr_fun_t) mpfr_eq, MPEXPR_TYPE_I_TERNARY_UI },
! 313: { "exp", (mpexpr_fun_t) e_mpfr_exp, MPEXPR_TYPE_UNARY },
! 314: { "expm1", (mpexpr_fun_t) e_mpfr_expm1, MPEXPR_TYPE_UNARY },
! 315: { "fac", (mpexpr_fun_t) e_mpfr_fac_ui, MPEXPR_TYPE_UNARY_UI },
! 316: { "floor", (mpexpr_fun_t) mpfr_floor, MPEXPR_TYPE_UNARY },
! 317: { "fma", (mpexpr_fun_t) e_mpfr_fma, MPEXPR_TYPE_TERNARY },
! 318: { "hypot", (mpexpr_fun_t) e_mpfr_hypot, MPEXPR_TYPE_BINARY },
! 319: { "inf_p", (mpexpr_fun_t) mpfr_inf_p, MPEXPR_TYPE_I_UNARY },
! 320: { "log", (mpexpr_fun_t) e_mpfr_log, MPEXPR_TYPE_UNARY },
! 321: { "log2", (mpexpr_fun_t) e_mpfr_log2, MPEXPR_TYPE_UNARY },
! 322: { "log10", (mpexpr_fun_t) e_mpfr_log10, MPEXPR_TYPE_UNARY },
! 323: { "log1p", (mpexpr_fun_t) e_mpfr_log1p, MPEXPR_TYPE_UNARY },
! 324: { "max", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_MAX
! 325: | MPEXPR_TYPE_PAIRWISE },
! 326: { "min", (mpexpr_fun_t) e_mpfr_cmp, MPEXPR_TYPE_MIN
! 327: | MPEXPR_TYPE_PAIRWISE },
! 328: { "nan_p", (mpexpr_fun_t) mpfr_nan_p, MPEXPR_TYPE_I_UNARY },
! 329: { "number_p",(mpexpr_fun_t) mpfr_number_p, MPEXPR_TYPE_I_UNARY },
! 330: { "reldiff", (mpexpr_fun_t) e_mpfr_reldiff, MPEXPR_TYPE_BINARY },
! 331: { "round", (mpexpr_fun_t) mpfr_round, MPEXPR_TYPE_UNARY },
! 332: { "sgn", (mpexpr_fun_t) e_mpfr_sgn, MPEXPR_TYPE_I_UNARY },
! 333: { "sin", (mpexpr_fun_t) e_mpfr_sin, MPEXPR_TYPE_UNARY },
! 334: { "sinh", (mpexpr_fun_t) e_mpfr_sinh, MPEXPR_TYPE_UNARY },
! 335: { "sqrt", (mpexpr_fun_t) e_mpfr_sqrt, MPEXPR_TYPE_UNARY },
! 336: { "tan", (mpexpr_fun_t) e_mpfr_tan, MPEXPR_TYPE_UNARY },
! 337: { "tanh", (mpexpr_fun_t) e_mpfr_tanh, MPEXPR_TYPE_UNARY },
! 338: { "trunc", (mpexpr_fun_t) mpfr_trunc, MPEXPR_TYPE_UNARY },
! 339:
! 340: { "euler", (mpexpr_fun_t) e_mpfr_const_euler, MPEXPR_TYPE_CONSTANT },
! 341: { "loge2", (mpexpr_fun_t) e_mpfr_const_log2, MPEXPR_TYPE_CONSTANT },
! 342: { "nan", (mpexpr_fun_t) mpfr_set_nan, MPEXPR_TYPE_CONSTANT },
! 343: { "inf", (mpexpr_fun_t) e_mpfr_set_posinf, MPEXPR_TYPE_CONSTANT },
! 344: { "pi", (mpexpr_fun_t) e_mpfr_const_pi, MPEXPR_TYPE_CONSTANT },
! 345:
! 346: { NULL }
! 347: };
! 348:
! 349: __gmp_const struct mpexpr_operator_t * __gmp_const mpfr_expr_standard_table
! 350: = _mpfr_expr_standard_table;
! 351:
! 352:
! 353: int
! 354: #if HAVE_STDARG
! 355: mpfr_expr (mpfr_ptr res, int base, __gmp_const char *e, ...)
! 356: #else
! 357: mpfr_expr (va_alist)
! 358: va_dcl
! 359: #endif
! 360: {
! 361: mpfr_srcptr var[MPEXPR_VARIABLES];
! 362: va_list ap;
! 363: int ret;
! 364: #if HAVE_STDARG
! 365: va_start (ap, e);
! 366: #else
! 367: mpfr_ptr res;
! 368: int base;
! 369: __gmp_const char *e;
! 370: va_start (ap);
! 371: res = va_arg (ap, mpfr_ptr);
! 372: base = va_arg (ap, int);
! 373: e = va_arg (ap, __gmp_const char *);
! 374: #endif
! 375:
! 376: TRACE (printf ("mpfr_expr(): base %d, %s\n", base, e));
! 377: ret = mpexpr_va_to_var ((void **) var, ap);
! 378: va_end (ap);
! 379:
! 380: if (ret != MPEXPR_RESULT_OK)
! 381: return ret;
! 382:
! 383: return mpfr_expr_a (mpfr_expr_standard_table, res, base,
! 384: mpfr_get_prec (res), e, strlen(e), var);
! 385: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>