メタプログラミングでcos

メタプログラミングの練習にcosを求めるコードを作ってみた。もう2段階くらいテーラー展開をすると更に精度は上がるだろうが、今のままでも普通に使う分には十分だ。

#include<iostream>
#include<boost/format.hpp>

//const double PI = 3.141592653;

template<unsigned int x>
struct Factorial
{
	enum {val = x * Factorial<x-1>::val};
};

template<>
struct Factorial<1>
{
	enum {val = 1};
};

template<int x>
inline const double get_cos()
{
	const double y = 0.001*x;
	return 1.0
		 - y*y/Factorial<2>::val
		 + y*y*y*y/Factorial<4>::val
		 - y*y*y*y*y *y/Factorial<6>::val
		 + y*y*y*y*y *y*y*y/Factorial<8>::val
		 - y*y*y*y*y *y*y*y*y*y/Factorial<10>::val
		 + y*y*y*y*y *y*y*y*y*y *y*y/Factorial<12>::val;
}

int main()
{
	const double cos1 = get_cos<3141>();

	std::cout << boost::format("%0.7lf\n") % cos1;

	return 0;
}

output:-0.9998996