102 lines
2.3 KiB
C++
102 lines
2.3 KiB
C++
/**************************************************************************
|
|
*
|
|
* (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...
|
|
;
|
|
}
|
|
}
|
|
|