#include <iostream>
#include <cmath>

#define VALUE 2
#define EXP 1000

double IterFastExpt(double base, long exponent);
double square (double base);

int main(int argc, char *argv[])
{
	std::cout << IterFastExpt(VALUE, EXP) << std::endl;
	std::cout << pow(VALUE, EXP) << std::endl;
}

double IterFastExpt(double base, long exponent)
{
	int Icount = 0;
	double Result = 1;
	while (exponent)
	{
		if (exponent % 2 == 0)
		{
			base = square (base);
			exponent = exponent / 2;
		}
		else
		{
			Result = base * Result;
			exponent--;
		}
		Icount++;
	}
	std::cout << Icount << std::endl;
	return Result;
}

double square (double base)
{
	return base * base;
}