1  /*
       2   * Copyright (c) 2008-2020 Stefan Krah. All rights reserved.
       3   *
       4   * Redistribution and use in source and binary forms, with or without
       5   * modification, are permitted provided that the following conditions
       6   * are met:
       7   *
       8   * 1. Redistributions of source code must retain the above copyright
       9   *    notice, this list of conditions and the following disclaimer.
      10   *
      11   * 2. Redistributions in binary form must reproduce the above copyright
      12   *    notice, this list of conditions and the following disclaimer in the
      13   *    documentation and/or other materials provided with the distribution.
      14   *
      15   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
      16   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      17   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      18   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      19   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      20   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      21   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      22   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      23   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      24   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      25   * SUCH DAMAGE.
      26   */
      27  
      28  
      29  #include <stdio.h>
      30  #include <stdlib.h>
      31  #include <time.h>
      32  #include <mpdecimal.h>
      33  
      34  
      35  int
      36  main(int argc, char **argv)
      37  {
      38  	mpd_context_t ctx;
      39  	mpd_t *a, *b;
      40  	mpd_t *result;
      41  	char *rstring;
      42  	char status_str[MPD_MAX_FLAG_STRING];
      43  	clock_t start_clock, end_clock;
      44  
      45  	if (argc != 3) {
      46  		fprintf(stderr, "pow: usage: ./pow x y\n");
      47  		exit(1);
      48  	}
      49  
      50  	mpd_init(&ctx, 38);
      51  	ctx.traps = 0;
      52  
      53  	result = mpd_new(&ctx);
      54  	a = mpd_new(&ctx);
      55  	b = mpd_new(&ctx);
      56  	mpd_set_string(a, argv[1], &ctx);
      57  	mpd_set_string(b, argv[2], &ctx);
      58  
      59  	start_clock = clock();
      60  	mpd_pow(result, a, b, &ctx);
      61  	end_clock = clock();
      62  	fprintf(stderr, "time: %f\n\n",
      63  	           (double)(end_clock-start_clock)/(double)CLOCKS_PER_SEC);
      64  
      65  	rstring = mpd_to_sci(result, 1);
      66  	mpd_snprint_flags(status_str, MPD_MAX_FLAG_STRING, ctx.status);
      67  	printf("%s  %s\n", rstring, status_str);
      68  
      69  	mpd_del(a);
      70  	mpd_del(b);
      71  	mpd_del(result);
      72  	mpd_free(rstring);
      73  
      74  	return 0;
      75  }
      76  
      77