メタプログラミングで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