n乗根:問題1.45
平均緩和の繰り返しは、average-dampをfunctionラッパで包めば、
repeatedが使える。そうやって調べてみると、数のn乗根に対し、
⌊log2n⌋回の平均緩和を必要とする模様(⌊ ⌋は床関数)。
-----
const double nthRootFixed2(const double x,const
int n)
{
const
function<function<double(double)>(function<double(double)>)>
wrappedAverageDamp=averageDamp;
const
int nIteration(floor(log(static_cast<double>(n))/log(2.0)));
return(fixedPointOfTransform([x,n](const double
y){return(x/pow(y,n-1));},
repeated(wrappedAverageDamp,nIteration),1.0));
}
const double sqrtFixed2(const double x)
{
return(nthRootFixed2(x,2));
}
const double cbrtFixed2(const double x)
{
return(nthRootFixed2(x,3));
}
const double qrrtFixed2(const double x)
{
return(nthRootFixed2(x,4));
}
int main(int argc, char** argv)
{
cout<<setprecision(16)<<"sqrt(2)="
<<sqrtFixed2(2.0)<<endl;
cout<<setprecision(16)<<"cbrt(2)="
<<cbrtFixed2(2.0)<<endl;
cout<<setprecision(16)<<"quartic-root(2)="
<<qrrtFixed2(2.0)<<endl;
const
int n(128);
cout<<setprecision(16)<<n<<"th-root(2)="
<<nthRootFixed2(2.0,n)<<endl;
return(0);
}
----
出力
----
sqrt(2)=1.414213562373095
cbrt(2)=1.259921032812682
quartic-root(2)=1.189207115002721
128th-root(2)=1.005429901112803
0 件のコメント :
コメントを投稿