Taylor展開

Taylor展開を計算せよといわれてつい思い出すのはC++ Templateによるコンパイル時計算。

演習の注意書きに

「使用言語は問わない。ただし、作成するプログラムの性能には常に注意すること」

と書いてある。性能に注意して作成すれば・・・定数化するのは当然ともいえるが・・・;

でもふと思い立ったので、iteratorやらboost::lambdaやらその辺の勉強をすべく、変なことに挑戦。

結局こんな感じ。

using namespace std;
using namespace boost;
using namespace boost::lambda;
 
 
double taylor(int n, function1<double, int> func){
  return accumulate(
    make_transform_iterator(make_counting_iterator(0),func),
    make_transform_iterator(make_counting_iterator(n),func),
   0.0);
}
 
double fact(int n){
  if(n<=1)return 1.0;
  else return n*fact(n-1);
}
 
 
int main(){
  double (*dpow)(double,double) = &pow;//use double version
  cout << taylor(15,
                 (bind(dpow,-5.5,_1) / bind(fact,_1))
                 ) << endl;
 
  cout << 1/taylor(15,
                 (bind(dpow,5.5,_1) / bind(fact,_1))
                 ) << endl;
  cout<<exp(-5.5);
}