// // LolRemez - Remez algorithm implementation // // Copyright © 2005—2015 Sam Hocevar // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What the Fuck You Want // to Public License, Version 2, as published by the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "solver.h" #include "expression.h" using lol::real; using lol::String; void FAIL(char const *message) { printf("Error: %s\n", message); printf("\n"); printf("Usage:\n"); printf(" lolremez [-d degree] [-i xmin xmax] x-expression [x-error]\n"); printf("\n"); printf("Example:\n"); printf(" lolremez -d 4 -i -1 1 \"atan(exp(1+x))\"\n"); printf(" lolremez -d 4 -i -1 1 \"atan(exp(1+x))\" \"exp(1+x)\"\n"); printf("\n"); exit(EXIT_FAILURE); } /* See the tutorial at http://lolengine.net/wiki/doc/maths/remez */ int main(int argc, char **argv) { char const *xmin = "-1", *xmax = "1"; char const *f = nullptr, *g = nullptr; int degree = 4; for (int i = 1; i < argc; ++i) { if (argv[i] == String("-d")) { if (i + 1 >= argc) FAIL("not enough arguments for -d"); degree = atoi(argv[++i]); } else if (argv[i] == String("-i")) { if (i + 2 >= argc) FAIL("not enough arguments for -i"); xmin = argv[++i]; xmax = argv[++i]; } else if (g) { FAIL("unknown argument"); } else if (f) { g = argv[i]; } else { f = argv[i]; } } if (!f) FAIL("no function specified"); if (real(xmin) >= real(xmax)) FAIL("invalid range"); remez_solver solver(degree, 20); solver.run(xmin, xmax, f, g); return 0; }