double r2 = dx * dx + dy * dy;
double r3 = r2 * sqrt(r2);
2行目をもっと速いものに置き換えることはできますか?関係のないものsqrt
?
double r2 = dx * dx + dy * dy;
double r3 = r2 * sqrt(r2);
2行目をもっと速いものに置き換えることはできますか?関係のないものsqrt
?
どうですか
double r3 = pow(r2,1.5);
sqrtがpowの特殊なケースとして実装されている場合、乗算を節約できます。物事の壮大な計画にはあまり気にしないでください!
より高い効率を本当に求めている場合は、r^3が本当に必要かどうかを検討してください。たとえば、それ(またはそれから派生したもの)をテストして、特定のしきい値を超えているかどうかを確認する場合は、代わりにr2をテストします。
const double r3_threshold = 9;
//don't do this
if (r3 > r3_threshold)
....
//do do this
const double r2_threshold = pow(r3_threshold,2./3.);
if (r2 > r2_threshold)
....
この方法pow
は、コンパイル時にも、一度だけ呼び出されます。
編集毎回しきい値を再計算する必要がある場合は、Q_rsqrtに関する回答は一見の価値があり、おそらくこれを上回る価値があると思います
高速逆平方根を使用します(Q_rsqrt
関数を取得します)。
あなたが持っている:
float r2;
// ... r2 gets a value
float invsqrt = Q_rsqrt(r2);
float r3 = r2*r2*invsqrt; // x*x/sqrt(x) = x*sqrt(x)
注:型の場合、データ型も処理する関数を作成するのに役立つdouble
ような定数があります。0x5f3759df
double
後の編集:この方法はすでにここで説明されているようです。
後の編集2:の定数double
はウィキペディアのリンクにありました:
Lomontは、64ビットIEEE754サイズタイプdoubleの「マジックナンバー」は0x5fe6ec85e7de30daであると指摘しましたが、実際には0x5fe6eb50c7aa19f9に近い値です。
あなたの質問を見る別の方法は、「sqrt(n)を計算する(または概算する)方法」だと思います。そこからあなたの質問は取るに足らないものになるでしょう(n * sqrt(n))。もちろん、どの程度のエラーが発生する可能性があるかを定義する必要があります。ウィキペディアには多くのオプションがあります。
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots