#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;
}