[BACK]Return to exprfr.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / demos / expr

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>