13
double r2 = dx * dx + dy * dy;
double r3 = r2 * sqrt(r2);

2行目をもっと速いものに置き換えることはできますか?関係のないものsqrt

4

3 に答える 3

14

どうですか

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に関する回答は一見の価値があり、おそらくこれを上回る価値があると思います

于 2011-12-09T13:22:27.737 に答える
12

高速逆平方根を使用します(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ような定数があります。0x5f3759dfdouble

後の編集:この方法はすでにここで説明されているようです。

後の編集2:の定数doubleはウィキペディアのリンクにありました:

Lomontは、64ビットIEEE754サイズタイプdoubleの「マジックナンバー」は0x5fe6ec85e7de30daであると指摘しましたが、実際には0x5fe6eb50c7aa19f9に近い値です。

于 2011-12-09T13:29:28.407 に答える
1

あなたの質問を見る別の方法は、「sqrt(n)を計算する(または概算する)方法」だと思います。そこからあなたの質問は取るに足らないものになるでしょう(n * sqrt(n))。もちろん、どの程度のエラーが発生する可能性があるかを定義する必要があります。ウィキペディアには多くのオプションがあります。

http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

于 2011-12-09T13:36:47.040 に答える