| @@ -11,7 +11,9 @@ bench: | |||||
| .PHONY: bench | .PHONY: bench | ||||
| dist: lolunit-$(LOLUNIT_VERSION).tar.gz | dist: lolunit-$(LOLUNIT_VERSION).tar.gz | ||||
| dist: lolremez-$(LOLREMEZ_VERSION).tar.gz | |||||
| .PHONY: lolunit-$(LOLUNIT_VERSION).tar.gz | |||||
| lolunit-$(LOLUNIT_VERSION).tar.gz: | lolunit-$(LOLUNIT_VERSION).tar.gz: | ||||
| rm -rf lolunit-$(LOLUNIT_VERSION) | rm -rf lolunit-$(LOLUNIT_VERSION) | ||||
| mkdir lolunit-$(LOLUNIT_VERSION) | mkdir lolunit-$(LOLUNIT_VERSION) | ||||
| @@ -20,3 +22,24 @@ lolunit-$(LOLUNIT_VERSION).tar.gz: | |||||
| tar cvzf lolunit-$(LOLUNIT_VERSION).tar.gz lolunit-$(LOLUNIT_VERSION) | tar cvzf lolunit-$(LOLUNIT_VERSION).tar.gz lolunit-$(LOLUNIT_VERSION) | ||||
| rm -rf lolunit-$(LOLUNIT_VERSION) | rm -rf lolunit-$(LOLUNIT_VERSION) | ||||
| .PHONY: lolremez-$(LOLREMEZ_VERSION).tar.gz | |||||
| lolremez-$(LOLREMEZ_VERSION).tar.gz: | |||||
| rm -rf lolremez-$(LOLREMEZ_VERSION) | |||||
| mkdir lolremez-$(LOLREMEZ_VERSION) | |||||
| mkdir lolremez-$(LOLREMEZ_VERSION)/lol | |||||
| mkdir lolremez-$(LOLREMEZ_VERSION)/lol/math | |||||
| cp $(top_srcdir)/src/real.cpp $(top_srcdir)/test/math/remez.cpp \ | |||||
| lolremez-$(LOLREMEZ_VERSION) | |||||
| cat $(top_srcdir)/src/real.cpp | sed 's@core.h@lol/math/real.h@' > \ | |||||
| lolremez-$(LOLREMEZ_VERSION)/real.cpp | |||||
| cp $(top_srcdir)/src/lol/math/real.h \ | |||||
| $(top_srcdir)/src/lol/math/matrix.h \ | |||||
| $(top_srcdir)/src/lol/math/remez.h \ | |||||
| lolremez-$(LOLREMEZ_VERSION)/lol/math | |||||
| printf 'remez: real.cpp remez.cpp\n' > lolremez-$(LOLREMEZ_VERSION)/Makefile | |||||
| printf '\t$$(CXX) -I. -O2 -g -ggdb $$^ -o $$@\n' >> lolremez-$(LOLREMEZ_VERSION)/Makefile | |||||
| printf 'clean:\n' >> lolremez-$(LOLREMEZ_VERSION)/Makefile | |||||
| printf '\trm -f remez\n' >> lolremez-$(LOLREMEZ_VERSION)/Makefile | |||||
| tar cvzf lolremez-$(LOLREMEZ_VERSION).tar.gz lolremez-$(LOLREMEZ_VERSION) | |||||
| rm -rf lolremez-$(LOLREMEZ_VERSION) | |||||
| @@ -10,6 +10,8 @@ dnl AM_MAINTAINER_MODE | |||||
| dnl Versioning of the separate software we ship | dnl Versioning of the separate software we ship | ||||
| LOLUNIT_VERSION=0.1 | LOLUNIT_VERSION=0.1 | ||||
| AC_SUBST(LOLUNIT_VERSION) | AC_SUBST(LOLUNIT_VERSION) | ||||
| LOLREMEZ_VERSION=0.1 | |||||
| AC_SUBST(LOLREMEZ_VERSION) | |||||
| AM_CONFIG_HEADER(config.h) | AM_CONFIG_HEADER(config.h) | ||||
| @@ -16,6 +16,7 @@ | |||||
| #if !defined __LOL_MATH_MATRIX_H__ | #if !defined __LOL_MATH_MATRIX_H__ | ||||
| #define __LOL_MATH_MATRIX_H__ | #define __LOL_MATH_MATRIX_H__ | ||||
| #include <stdint.h> | |||||
| #include <cmath> | #include <cmath> | ||||
| #if !defined __ANDROID__ | #if !defined __ANDROID__ | ||||
| # include <iostream> | # include <iostream> | ||||
| @@ -9,13 +9,17 @@ | |||||
| // | // | ||||
| // | // | ||||
| // The Remez class | |||||
| // --------------- | |||||
| // The RemezSolver class | |||||
| // --------------------- | |||||
| // | // | ||||
| #if !defined __LOL_MATH_REMEZ_H__ | #if !defined __LOL_MATH_REMEZ_H__ | ||||
| #define __LOL_MATH_REMEZ_H__ | #define __LOL_MATH_REMEZ_H__ | ||||
| #include <cstdio> | |||||
| #include "lol/math/matrix.h" | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -57,6 +61,11 @@ public: | |||||
| PrintPoly(); | PrintPoly(); | ||||
| } | } | ||||
| inline void Run(T a, T b, RealFunc *func, int steps) | |||||
| { | |||||
| Run(a, b, func, NULL, steps); | |||||
| } | |||||
| T ChebyEval(T const &x) | T ChebyEval(T const &x) | ||||
| { | { | ||||
| T ret = 0.0, xn = 1.0; | T ret = 0.0, xn = 1.0; | ||||
| @@ -319,7 +328,9 @@ public: | |||||
| T Weight(T const &x) | T Weight(T const &x) | ||||
| { | { | ||||
| return m_weight(x * m_k2 + m_k1); | |||||
| if (m_weight) | |||||
| return m_weight(x * m_k2 + m_k1); | |||||
| return 1; | |||||
| } | } | ||||
| /* ORDER + 1 Chebyshev coefficients and 1 error value */ | /* ORDER + 1 Chebyshev coefficients and 1 error value */ | ||||
| @@ -12,38 +12,23 @@ | |||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #endif | ||||
| #include <cstdio> | |||||
| #include <cstdlib> | |||||
| #if USE_SDL && defined __APPLE__ | #if USE_SDL && defined __APPLE__ | ||||
| # include <SDL_main.h> | # include <SDL_main.h> | ||||
| #endif | #endif | ||||
| #include "lol/math/real.h" | #include "lol/math/real.h" | ||||
| #include "lol/math/matrix.h" | |||||
| #include "lol/math/remez.h" | #include "lol/math/remez.h" | ||||
| using lol::real; | using lol::real; | ||||
| using lol::RemezSolver; | using lol::RemezSolver; | ||||
| /* The function we want to approximate */ | |||||
| real myfun(real const &y) | |||||
| { | |||||
| real x = sqrt(y); | |||||
| return (sin(x) - x) / (x * y); | |||||
| } | |||||
| real myerr(real const &y) | |||||
| { | |||||
| real x = sqrt(y); | |||||
| return sin(x) / (x * y); | |||||
| } | |||||
| /* See the tutorial at http://lol.zoy.org/wiki/doc/maths/remez */ | |||||
| real f(real const &x) { return exp(x); } | |||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| { | { | ||||
| RemezSolver<2, real> solver; | |||||
| solver.Run(real::R_1 >> 400, real::R_PI_2 * real::R_PI_2, myfun, myerr, 40); | |||||
| return EXIT_SUCCESS; | |||||
| RemezSolver<4, real> solver; | |||||
| solver.Run(-1, 1, f, 30); | |||||
| return 0; | |||||
| } | } | ||||