// David Eberly, Geometric Tools, Redmond WA 98052
// Copyright (c) 1998-2020
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
// https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
// Version: 4.0.2019.12.23

#pragma once

#include <Mathematics/Exp2Estimate.h>

// Minimax polynomial approximations to 2^x.  The polynomial p(x) of
// degree D minimizes the quantity maximum{|2^x - p(x)| : x in [0,1]}
// over all polynomials of degree D.  The natural exponential is
// computed using exp(x) = 2^{x/log(2)}, where log(2) is the natural
// logarithm of 2.

namespace WwiseGTE
{
    template <typename Real>
    class ExpEstimate
    {
    public:
        // The input constraint is x in [0,1].  For example,
        //   float x; // in [0,1]
        //   float result = ExpEstimate<float>::Degree<3>(x);
        template <int D>
        inline static Real Degree(Real x)
        {
            return Exp2Estimate<Real>::Degree<D>(x * (Real)GTE_C_INV_LN_2);
        }

        // The input x can be any real number.  Range reduction is used to
        // generate a value y in [0,1], call Degree(y), and combine the output
        // with the proper exponent to obtain the approximation.  For example,
        //   float x;  // x >= 0
        //   float result = ExpEstimate<float>::DegreeRR<3>(x);
        template <int D>
        inline static Real DegreeRR(Real x)
        {
            return Exp2Estimate<Real>::DegreeRR<D>(x * (Real)GTE_C_INV_LN_2);
        }
    };
}