[ create a new paste ] login | about

Link: http://codepad.org/v7Gv4M0d    [ raw code | output | fork ]

C++, pasted on Sep 26:
#include <cmath>

#include <cstdio>
#include <cstdlib>
#include <ctime>

template <int power>
double Power(double base);

template <int mod_2>
struct Better
{
};

template <>
struct Better<0>
{
  template <int power>
  static double Power(double base)
  {
    return ::Power<2>(::Power<power / 2>(base));
  }
};

template <>
struct Better<1>
{
  template <int power>
  static double Power(double base)
  {
    return ::Power<power - 1>(base) * base;
  }
};

template <int power>
double Power(double base)
{
  static const int new_power = power < 0 ? -power : power;
  return Better<new_power % 2>::template Power<new_power>(power < 0 ? 1.0 / base : base);
}

template <>
double Power<0>(double base)
{
  return 1.0;
}

template <>
double Power<1>(double base)
{
  return base;
}

template <>
double Power<2>(double base)
{
  return base*base;
}

int main(void)
{
  srand((unsigned) time(NULL));
  float num = 1.0f + 0.001f * (rand() % 512 / 256.0f - 1);
  printf("%f\n", num);
  printf("%f\n", Power<-997>(num));
  printf("%f\n", pow(num, -997));
  return 0;
}


Output:
1
2
3
0.999895
1.110855
1.110855


Create a new paste based on this one


Comments: