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

数学计算

开发平台:

Unix_Linux

  1. /* Demo program to run expression evaluation.
  2. Copyright 2000, 2001, 2002, 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. /* Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...
  15.    Evaluate each argument as a simple expression.  By default this is in mpz
  16.    integers, but -q selects mpq or -f selects mpf.  For mpf the float
  17.    precision can be set with -p.  In all cases the input base can be set
  18.    with -b, or the default is "0" meaning decimal with "0x" allowed.
  19.    This is a pretty trivial program, it's just an easy way to experiment
  20.    with the evaluation functions.  */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include "gmp.h"
  24. #include "expr.h"
  25. void
  26. run_expr (int type, int base, unsigned long prec, char *str)
  27. {
  28.   int  outbase = (base == 0 ? 10 : base);
  29.   int  ret;
  30.   switch (type) {
  31.   case 'z':
  32.   default:
  33.     {
  34.       mpz_t  res, var_a, var_b;
  35.       mpz_init (res);
  36.       mpz_init_set_ui (var_a, 55L);
  37.       mpz_init_set_ui (var_b, 99L);
  38.       ret = mpz_expr (res, base, str, var_a, var_b, NULL);
  39.       printf (""%s" base %d: ", str, base);
  40.       if (ret == MPEXPR_RESULT_OK)
  41.         {
  42.           printf ("result ");
  43.           mpz_out_str (stdout, outbase, res);
  44.           printf ("n");
  45.         }
  46.       else
  47.         printf ("invalid (return code %d)n", ret);
  48.       mpz_clear (res);
  49.       mpz_clear (var_a);
  50.       mpz_clear (var_b);
  51.     }
  52.     break;
  53.   case 'q':
  54.     {
  55.       mpq_t  res, var_a, var_b;
  56.       mpq_init (res);
  57.       mpq_init (var_a);
  58.       mpq_init (var_b);
  59.       mpq_set_ui (var_a, 55L, 1);
  60.       mpq_set_ui (var_b, 99L, 1);
  61.       ret = mpq_expr (res, base, str, var_a, var_b, NULL);
  62.       printf (""%s" base %d: ", str, base);
  63.       if (ret == MPEXPR_RESULT_OK)
  64.         {
  65.           printf ("result ");
  66.           mpq_out_str (stdout, outbase, res);
  67.           printf ("n");
  68.         }
  69.       else
  70.         printf ("invalid (return code %d)n", ret);
  71.       mpq_clear (res);
  72.       mpq_clear (var_a);
  73.       mpq_clear (var_b);
  74.     }
  75.     break;
  76.   case 'f':
  77.     {
  78.       mpf_t  res, var_a, var_b;
  79.       mpf_init2 (res, prec);
  80.       mpf_init_set_ui (var_a, 55L);
  81.       mpf_init_set_ui (var_b, 99L);
  82.       ret = mpf_expr (res, base, str, var_a, var_b, NULL);
  83.       printf (""%s" base %d: ", str, base);
  84.       if (ret == MPEXPR_RESULT_OK)
  85.         {
  86.           printf ("result ");
  87.           mpf_out_str (stdout, outbase, (size_t) 0, res);
  88.           printf ("n");
  89.         }
  90.       else
  91.         printf ("invalid (return code %d)n", ret);
  92.       mpf_clear (res);
  93.       mpf_clear (var_a);
  94.       mpf_clear (var_b);
  95.     }
  96.     break;
  97.   }
  98. }
  99. int
  100. main (int argc, char *argv[])
  101. {
  102.   int            type = 'z';
  103.   int            base = 0;
  104.   unsigned long  prec = 64;
  105.   int            seen_expr = 0;
  106.   int            opt;
  107.   char           *arg;
  108.   for (;;)
  109.     {
  110.       argv++;
  111.       arg = argv[0];
  112.       if (arg == NULL)
  113.         break;
  114.       if (arg[0] == '-')
  115.         {
  116.           for (;;)
  117.             {
  118.               arg++;
  119.               opt = arg[0];
  120.               switch (opt) {
  121.               case '':
  122.                 goto end_opt;
  123.               case 'f':
  124.               case 'q':
  125.               case 'z':
  126.                 type = opt;
  127.                 break;
  128.               case 'b':
  129.                 arg++;
  130.                 if (arg[0] == '')
  131.                   {
  132.                     argv++;
  133.                     arg = argv[0];
  134.                     if (arg == NULL)
  135.                       {
  136.                       need_arg:
  137.                         fprintf (stderr, "Need argument for -%cn", opt);
  138.                         exit (1);
  139.                       }
  140.                   }
  141.                 base = atoi (arg);
  142.                 goto end_opt;
  143.               case 'p':
  144.                 arg++;
  145.                 if (arg[0] == '')
  146.                   {
  147.                     argv++;
  148.                     arg = argv[0];
  149.                     if (arg == NULL)
  150.                       goto need_arg;
  151.                   }
  152.                 prec = atoi (arg);
  153.                 goto end_opt;
  154.               case '-':
  155.                 arg++;
  156.                 if (arg[0] != '')
  157.                   {
  158.                     /* no "--foo" options */
  159.                     fprintf (stderr, "Unrecognised option --%sn", arg);
  160.                     exit (1);
  161.                   }
  162.                 /* stop option interpretation at "--" */
  163.                 for (;;)
  164.                   {
  165.                     argv++;
  166.                     arg = argv[0];
  167.                     if (arg == NULL)
  168.                       goto done;
  169.                     run_expr (type, base, prec, arg);
  170.                     seen_expr = 1;
  171.                   }
  172.               default:
  173.                 fprintf (stderr, "Unrecognised option -%cn", opt);
  174.                 exit (1);
  175.               }
  176.             }
  177.         end_opt:
  178.           ;
  179.         }
  180.       else
  181.         {
  182.           run_expr (type, base, prec, arg);
  183.           seen_expr = 1;
  184.         }
  185.     }
  186.  done:
  187.   if (! seen_expr)
  188.     {
  189.       printf ("Usage: %s [-z] [-q] [-f] [-p prec] [-b base] expression...n", argv[0]);
  190.       exit (1);
  191.     }
  192.   return 0;
  193. }