exprqa.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:2k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* mpq expression evaluation
  2. Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include <stdio.h>
  15. #include "gmp.h"
  16. #include "expr-impl.h"
  17. static int
  18. e_mpq_ulong_p (mpq_srcptr q)
  19. {
  20.   return mpz_fits_ulong_p (mpq_numref (q))
  21.     && mpz_cmp_ui (mpq_denref (q), 1L) == 0;
  22. }
  23. /* get value as a ui, on the assumption it fits */
  24. static int
  25. e_mpq_get_ui_fits (mpq_srcptr q)
  26. {
  27.   return mpz_get_ui (mpq_numref (q));
  28. }
  29. static void
  30. e_mpq_set_si1 (mpq_ptr q, long num)
  31. {
  32.   mpq_set_si (q, num, 1L);
  33. }
  34. /* The same as mpz, but putting the result in the numerator.  Negatives and
  35.    fractions aren't parsed here because '-' and '/' are operators. */
  36. static size_t
  37. e_mpq_number (mpq_ptr res, __gmp_const char *e, size_t elen, int base)
  38. {
  39.   mpz_set_ui (mpq_denref (res), 1L);
  40.   return mpexpr_mpz_number (mpq_numref (res), e, elen, base);
  41. }
  42. /* ignoring prec */
  43. static void
  44. e_mpq_init (mpq_ptr q, unsigned long prec)
  45. {
  46.   mpq_init (q);
  47. }
  48. int
  49. mpq_expr_a (__gmp_const struct mpexpr_operator_t *table,
  50.             mpq_ptr res, int base,
  51.             __gmp_const char *e, size_t elen,
  52.             mpq_srcptr var[26])
  53. {
  54.   struct mpexpr_parse_t  p;
  55.   p.table = table;
  56.   p.res = (mpX_ptr) res;
  57.   p.base = base;
  58.   p.e = e;
  59.   p.elen = elen;
  60.   p.var = (mpX_srcptr *) var;
  61.   p.mpX_clear       = (mpexpr_fun_one_t)      mpq_clear;
  62.   p.mpX_ulong_p     = (mpexpr_fun_i_unary_t)  e_mpq_ulong_p;
  63.   p.mpX_get_ui      = (mpexpr_fun_get_ui_t)   e_mpq_get_ui_fits;
  64.   p.mpX_init        = (mpexpr_fun_unary_ui_t) e_mpq_init;
  65.   p.mpX_number      = (mpexpr_fun_number_t)   e_mpq_number;
  66.   p.mpX_set         = (mpexpr_fun_unary_t)    mpq_set;
  67.   p.mpX_set_or_swap = (mpexpr_fun_unary_t)    mpq_swap;
  68.   p.mpX_set_si      = (mpexpr_fun_set_si_t)   e_mpq_set_si1;
  69.   p.mpX_swap        = (mpexpr_fun_swap_t)     mpq_swap;
  70.   return mpexpr_evaluate (&p);
  71. }