Compile-time Transcendental

む〜.

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

inline
double sin(double x) // x must be in [-pi/2, pi/2)
{
#define INIT_N 1
#define TERMINATING_N 12
#define SIN_TAYLOR_TERM(N, K, DUMMY) \
  * (1.0 - x * x / (K * (4 * K + 2))
#define CLOSING_PARENTHESIS(N, K, DUMMY) )
#define DUMMY

  return x
  BOOST_PP_REPEAT_FROM_TO(INIT_N, TERMINATING_N, SIN_TAYLOR_TERM, DUMMY)
  BOOST_PP_REPEAT_FROM_TO(INIT_N, TERMINATING_N, CLOSING_PARENTHESIS, DUMMY)
  ;

#undef INIT_N
#undef TERMINATING_N
#undef SIN_TAYLOR_TERM
#undef CLOSING_PARENTHESIS
#undef DUMMY
}

int main()
{
  std::cout << sin(3.141592653589793 / 6.0) << std::endl; // VC++7.1 with /Oxで即値

  return 0;
}

前に2chでも話題に上っていたコンパイル時の浮動小数計算.自分も前々からこれ考えてるけれど結局良い方法が無いなぁ.テンプレートでやるとどうしても実装コストがかかるし欠点も多いのでPreprocessorで級数展開させてコンパイラの最適化に期待する実装で妥協してみる.ただ,コンパイル時に決定しない値に対する計算を選択的に拒否する機構をどうしても思いつけない・・・.
#というか無理やん.やっぱ諦めよう.結局夜遅くまで起きていらんことやってるし・・・.
#そして振り出しに戻る.超(´・ω・`)ショボーン
#あ・・・