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