計算
ちょっと前に、x^yを計算したくなった。xはともかく、yも浮動小数点の範囲にある数なので、単純な以下の関数は使えない。
double pow(double x, int y){ if(y == 0) return 1; if(y == 1) return x; tmp = pow(x, y/2); if(y % 2 == 0){ return tmp * tmp; }else{ return tmp * tmp * x; } }
それならと言うことで、よく分からないままに
こんな感じのものを書いてみた。
double pow(double x, double y){ double ans = pow(x, (int)y);//上のpowを呼び出す double d = 1.0/2; double m = Math.sqrt(x); y -= (int)y; while(d > 1E-5){ if(y > d){ ans *= m; y -= d; } d /= 2; m = Math.sqrt(m); } return ans; }
ということで、すごく時間を無駄にしたわけですが、もっと楽な正解は
double pow(double x, double y){ return Math.exp(Math.log(x) * y); }
でしたとさ。気づくのに半日かかった。