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