//  Copyright John Maddock 2007.
//  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)

#include "required_defines.hpp"
#include "performance_measure.hpp"

#include <boost/math/special_functions/cbrt.hpp>

double cbrt_test()
{
   double result = 0;
   double val = 1e-100;
   for(int i = 0; i < 1000; ++i)
   {
      val *= 1.5;
      result += boost::math::cbrt(val);
   }
   return result;
}

BOOST_MATH_PERFORMANCE_TEST(cbrt_test, "cbrt")
{
   double result = cbrt_test();

   consume_result(result);
   set_call_count(1000);
}

double cbrt_pow_test()
{
   double result = 0;
   double val = 1e-100;
   for(int i = 0; i < 1000; ++i)
   {
      val *= 1.5;
      result += std::pow(val, 0.33333333333333333333333333333333);
   }
   return result;
}

BOOST_MATH_PERFORMANCE_TEST(cbrt_pow_test, "cbrt-pow")
{
   double result = cbrt_pow_test();

   consume_result(result);
   set_call_count(1000);
}

#ifdef TEST_CEPHES

extern "C" double cbrt(double);

double cbrt_cephes_test()
{
   double result = 0;
   double val = 1e-100;
   for(int i = 0; i < 1000; ++i)
   {
      val *= 1.5;
      result += ::cbrt(val);
   }
   return result;
}

BOOST_MATH_PERFORMANCE_TEST(cbrt_test, "cbrt-cephes")
{
   double result = cbrt_cephes_test();

   consume_result(result);
   set_call_count(1000);
}

#endif

#if defined(__GNUC__) && (__GNUC__ >= 4)

#include <math.h>

double cbrt_c99_test()
{
   double result = 0;
   double val = 1e-100;
   for(int i = 0; i < 1000; ++i)
   {
      val *= 1.5;
      result += ::cbrt(val);
   }
   return result;
}

BOOST_MATH_PERFORMANCE_TEST(cbrt_c99_test, "cbrt-c99")
{
   double result = cbrt_c99_test();

   consume_result(result);
   set_call_count(1000);
}

#endif
