1 /************************************************************************** 2 * 3 * (C) Copyright VMware, Inc 2010. 4 * (C) Copyright John Maddock 2006. 5 * Use, modification and distribution are subject to the 6 * Boost Software License, Version 1.0. (See accompanying file 7 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 * 9 **************************************************************************/ 10 11 12 /* 13 * This file allows to compute the minimax polynomial coefficients we use 14 * for fast exp2/log2. 15 * 16 * How to use this source: 17 * 18 * - Download and build the NTL library from 19 * http://shoup.net/ntl/download.html , or install libntl-dev package if on 20 * Debian. 21 * 22 * - Download boost source code matching to your distro. 23 * 24 * - Goto libs/math/minimax and replace f.cpp with this file. 25 * 26 * - Build as 27 * 28 * g++ -o minimax -I /path/to/ntl/include main.cpp f.cpp /path/to/ntl/src/ntl.a 29 * 30 * - Run as 31 * 32 * ./minimax 33 * 34 * - For example, to compute exp2 5th order polynomial between [0, 1] do: 35 * 36 * variant 0 37 * range 0 1 38 * order 5 0 39 * step 200 40 * info 41 * 42 * and take the coefficients from the P = { ... } array. 43 * 44 * - To compute log2 4th order polynomial between [0, 1/9] do: 45 * 46 * variant 1 47 * range 0 0.111111112 48 * order 4 0 49 * step 200 50 * info 51 * 52 * - For more info see 53 * http://www.boost.org/doc/libs/1_47_0/libs/math/doc/sf_and_dist/html/math_toolkit/toolkit/internals2/minimax.html 54 */ 55 56 #define L22 57 #include <boost/math/bindings/rr.hpp> 58 #include <boost/math/tools/polynomial.hpp> 59 60 #include <cmath> 61 62 boost::math::ntl::RR exp2(const boost::math::ntl::RR& x) 63 { 64 return exp(x*log(2.0)); 65 } 66 67 boost::math::ntl::RR log2(const boost::math::ntl::RR& x) 68 { 69 return log(x)/log(2.0); 70 } 71 72 boost::math::ntl::RR f(const boost::math::ntl::RR& x, int variant) 73 { 74 switch(variant) 75 { 76 case 0: 77 return exp2(x); 78 79 case 1: 80 return log2((1.0 + sqrt(x))/(1.0 - sqrt(x)))/sqrt(x); 81 } 82 83 return 0; 84 } 85 86 87 void show_extra( 88 const boost::math::tools::polynomial<boost::math::ntl::RR>& n, 89 const boost::math::tools::polynomial<boost::math::ntl::RR>& d, 90 const boost::math::ntl::RR& x_offset, 91 const boost::math::ntl::RR& y_offset, 92 int variant) 93 { 94 switch(variant) 95 { 96 default: 97 // do nothing here... 98 ; 99 } 100 } 101 102