計算

ちょっと前に、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);
}

でしたとさ。気づくのに半日かかった。