| /************************************************************************** |
| * |
| * (C) Copyright VMware, Inc 2010. |
| * (C) Copyright John Maddock 2006. |
| * Use, modification and distribution are subject to the |
| * Boost Software License, Version 1.0. (See accompanying file |
| * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| * |
| **************************************************************************/ |
| |
| |
| /* |
| * This file allows to compute the minimax polynomial coefficients we use |
| * for fast exp2/log2. |
| * |
| * How to use this source: |
| * |
| * - Download and build the NTL library from |
| * http://shoup.net/ntl/download.html , or install libntl-dev package if on |
| * Debian. |
| * |
| * - Download boost source code matching to your distro. |
| * |
| * - Goto libs/math/minimax and replace f.cpp with this file. |
| * |
| * - Build as |
| * |
| * g++ -o minimax -I /path/to/ntl/include main.cpp f.cpp /path/to/ntl/src/ntl.a |
| * |
| * - Run as |
| * |
| * ./minimax |
| * |
| * - For example, to compute exp2 5th order polynomial between [0, 1] do: |
| * |
| * variant 0 |
| * range 0 1 |
| * order 5 0 |
| * step 200 |
| * info |
| * |
| * and take the coefficients from the P = { ... } array. |
| * |
| * - To compute log2 4th order polynomial between [0, 1/9] do: |
| * |
| * variant 1 |
| * range 0 0.111111112 |
| * order 4 0 |
| * step 200 |
| * info |
| * |
| * - For more info see |
| * http://www.boost.org/doc/libs/1_47_0/libs/math/doc/sf_and_dist/html/math_toolkit/toolkit/internals2/minimax.html |
| */ |
| |
| #define L22 |
| #include <boost/math/bindings/rr.hpp> |
| #include <boost/math/tools/polynomial.hpp> |
| |
| #include <cmath> |
| |
| boost::math::ntl::RR exp2(const boost::math::ntl::RR& x) |
| { |
| return exp(x*log(2.0)); |
| } |
| |
| boost::math::ntl::RR log2(const boost::math::ntl::RR& x) |
| { |
| return log(x)/log(2.0); |
| } |
| |
| boost::math::ntl::RR f(const boost::math::ntl::RR& x, int variant) |
| { |
| switch(variant) |
| { |
| case 0: |
| return exp2(x); |
| |
| case 1: |
| return log2((1.0 + sqrt(x))/(1.0 - sqrt(x)))/sqrt(x); |
| } |
| |
| return 0; |
| } |
| |
| |
| void show_extra( |
| const boost::math::tools::polynomial<boost::math::ntl::RR>& n, |
| const boost::math::tools::polynomial<boost::math::ntl::RR>& d, |
| const boost::math::ntl::RR& x_offset, |
| const boost::math::ntl::RR& y_offset, |
| int variant) |
| { |
| switch(variant) |
| { |
| default: |
| // do nothing here... |
| ; |
| } |
| } |
| |