メタプログラミングでcos : 追記

2段階進めたら精度が上がるとか書きましたが、アレは嘘です。いや、上がりますが、それ以上に円周率の値の精度が悪すぎた。そしてVS2010でテストしたところ演算中にオーバーフローします。

故に、円周率の精度を上げた以下のコードにすると精度があがりました。

#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.00000001*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<314159265>();
	const double cos2 = get_cos<314159265/2>();
	const double cos3 = get_cos<314159265/4>();

	std::cout << boost::format("%0.11lf\n%0.11lf\n%0.11lf\n") % cos1 % cos2 % cos3;
	return 0;
}

output:
-0.99989952971
0.00000001312
0.70710678359