17db96d56Sopenharmony_ci/* 27db96d56Sopenharmony_ci * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. 37db96d56Sopenharmony_ci * 47db96d56Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 57db96d56Sopenharmony_ci * modification, are permitted provided that the following conditions 67db96d56Sopenharmony_ci * are met: 77db96d56Sopenharmony_ci * 87db96d56Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 97db96d56Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 107db96d56Sopenharmony_ci * 117db96d56Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 127db96d56Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 137db96d56Sopenharmony_ci * documentation and/or other materials provided with the distribution. 147db96d56Sopenharmony_ci * 157db96d56Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND 167db96d56Sopenharmony_ci * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 177db96d56Sopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 187db96d56Sopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 197db96d56Sopenharmony_ci * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 207db96d56Sopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 217db96d56Sopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 227db96d56Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 237db96d56Sopenharmony_ci * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 247db96d56Sopenharmony_ci * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 257db96d56Sopenharmony_ci * SUCH DAMAGE. 267db96d56Sopenharmony_ci */ 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci#include "mpdecimal.h" 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci#include <stdint.h> 327db96d56Sopenharmony_ci#include <stdio.h> 337db96d56Sopenharmony_ci#include <stdlib.h> 347db96d56Sopenharmony_ci#include <time.h> 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_cistatic void 387db96d56Sopenharmony_cierr_exit(const char *msg) 397db96d56Sopenharmony_ci{ 407db96d56Sopenharmony_ci fprintf(stderr, "%s\n", msg); 417db96d56Sopenharmony_ci exit(1); 427db96d56Sopenharmony_ci} 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_cistatic mpd_t * 457db96d56Sopenharmony_cinew_mpd(void) 467db96d56Sopenharmony_ci{ 477db96d56Sopenharmony_ci mpd_t *x = mpd_qnew(); 487db96d56Sopenharmony_ci if (x == NULL) { 497db96d56Sopenharmony_ci err_exit("out of memory"); 507db96d56Sopenharmony_ci } 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci return x; 537db96d56Sopenharmony_ci} 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci/* Nonsense version of escape-time algorithm for calculating a mandelbrot 567db96d56Sopenharmony_ci * set. Just for benchmarking. */ 577db96d56Sopenharmony_cistatic void 587db96d56Sopenharmony_cicolor_point(mpd_t *x0, mpd_t *y0, long maxiter, mpd_context_t *ctx) 597db96d56Sopenharmony_ci{ 607db96d56Sopenharmony_ci mpd_t *x, *y, *sq_x, *sq_y; 617db96d56Sopenharmony_ci mpd_t *two; 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci x = new_mpd(); 647db96d56Sopenharmony_ci y = new_mpd(); 657db96d56Sopenharmony_ci mpd_set_u32(x, 0, ctx); 667db96d56Sopenharmony_ci mpd_set_u32(y, 0, ctx); 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci sq_x = new_mpd(); 697db96d56Sopenharmony_ci sq_y = new_mpd(); 707db96d56Sopenharmony_ci mpd_set_u32(sq_x, 0, ctx); 717db96d56Sopenharmony_ci mpd_set_u32(sq_y, 0, ctx); 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci two = new_mpd(); 747db96d56Sopenharmony_ci mpd_set_u32(two, 2, ctx); 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci for (long i = 0; i < maxiter; i++) { 777db96d56Sopenharmony_ci mpd_mul(y, x, y, ctx); 787db96d56Sopenharmony_ci mpd_mul(y, y, two, ctx); 797db96d56Sopenharmony_ci mpd_add(y, y, y0, ctx); 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci mpd_sub(x, sq_x, sq_y, ctx); 827db96d56Sopenharmony_ci mpd_add(x, x, x0, ctx); 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci mpd_mul(sq_x, x, x, ctx); 857db96d56Sopenharmony_ci mpd_mul(sq_y, y, y, ctx); 867db96d56Sopenharmony_ci } 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci mpd_copy(x0, x, ctx); 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci mpd_del(two); 917db96d56Sopenharmony_ci mpd_del(sq_y); 927db96d56Sopenharmony_ci mpd_del(sq_x); 937db96d56Sopenharmony_ci mpd_del(y); 947db96d56Sopenharmony_ci mpd_del(x); 957db96d56Sopenharmony_ci} 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ciint 997db96d56Sopenharmony_cimain(int argc, char **argv) 1007db96d56Sopenharmony_ci{ 1017db96d56Sopenharmony_ci mpd_context_t ctx; 1027db96d56Sopenharmony_ci mpd_t *x0, *y0; 1037db96d56Sopenharmony_ci uint32_t prec = 19; 1047db96d56Sopenharmony_ci long iter = 10000000; 1057db96d56Sopenharmony_ci clock_t start_clock, end_clock; 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci if (argc != 3) { 1087db96d56Sopenharmony_ci err_exit("usage: bench prec iter\n"); 1097db96d56Sopenharmony_ci } 1107db96d56Sopenharmony_ci prec = strtoul(argv[1], NULL, 10); 1117db96d56Sopenharmony_ci iter = strtol(argv[2], NULL, 10); 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci mpd_init(&ctx, prec); 1147db96d56Sopenharmony_ci /* no more MPD_MINALLOC changes after here */ 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci x0 = new_mpd(); 1177db96d56Sopenharmony_ci y0 = new_mpd(); 1187db96d56Sopenharmony_ci mpd_set_string(x0, "0.222", &ctx); 1197db96d56Sopenharmony_ci mpd_set_string(y0, "0.333", &ctx); 1207db96d56Sopenharmony_ci if (ctx.status & MPD_Errors) { 1217db96d56Sopenharmony_ci mpd_del(y0); 1227db96d56Sopenharmony_ci mpd_del(x0); 1237db96d56Sopenharmony_ci err_exit("unexpected error during conversion"); 1247db96d56Sopenharmony_ci } 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci start_clock = clock(); 1277db96d56Sopenharmony_ci color_point(x0, y0, iter, &ctx); 1287db96d56Sopenharmony_ci end_clock = clock(); 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci mpd_print(x0); 1317db96d56Sopenharmony_ci fprintf(stderr, "time: %f\n\n", (double)(end_clock-start_clock)/(double)CLOCKS_PER_SEC); 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci mpd_del(y0); 1347db96d56Sopenharmony_ci mpd_del(x0); 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci return 0; 1377db96d56Sopenharmony_ci} 138