Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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.