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);
}