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