f.cpp revision ef1a2765a45c03b3bf7b5994197a611bcef96e0c
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 log2 5th order polynomial between [1, 2] do: 35 * 36 * variant 0 37 * range 1 2 38 * order 5 0 39 * step 200 40 * info 41 * 42 * and take the coefficients from the P = { ... } array. 43 * 44 * - To compute exp2 5th order polynomial between [0, 1] do: 45 * 46 * variant 1 47 * range 0 1 48 * order 5 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 63boost::math::ntl::RR f(const boost::math::ntl::RR& x, int variant) 64{ 65 static const boost::math::ntl::RR tiny = boost::math::tools::min_value<boost::math::ntl::RR>() * 64; 66 67 switch(variant) 68 { 69 case 0: 70 // log2(x)/(x - 1) 71 return log(x)/log(2.0)/(x - 1.0); 72 73 case 1: 74 // exp2(x) 75 return exp(x*log(2.0)); 76 } 77 78 return 0; 79} 80 81 82void show_extra( 83 const boost::math::tools::polynomial<boost::math::ntl::RR>& n, 84 const boost::math::tools::polynomial<boost::math::ntl::RR>& d, 85 const boost::math::ntl::RR& x_offset, 86 const boost::math::ntl::RR& y_offset, 87 int variant) 88{ 89 switch(variant) 90 { 91 default: 92 // do nothing here... 93 ; 94 } 95} 96 97