4

1/30 秒ごとに約 2000 回、数値の平方根を計算する必要がある iPhone アプリを作成しています。sqrt() はコンピューターでは正常に動作しますが、iPhone または iPad ではフレーム レートが約 10 FPS に低下し、残りのコードは既に最適化されています。平方根を見積もることでこれを劇的に高速化できると聞いたことがありますが、これを行うコードが見つかりません。小数点以下 1 桁または 2 桁の精度が必要です。これを行う方法、または物事をスピードアップする他の方法についての提案をいただければ幸いです。

ありがとう!

4

9 に答える 9

10

実際に平方根が必要な場合を除いて、生の値と平方根ではなく、平方根を比較してください。

比較のみが必要な場合、平方根をとるよりも2乗がはるかに高速(かつ正確)になります。これはほとんどのゲームがそれを行う方法です。

于 2010-09-16T01:00:23.773 に答える
4

平方根を求めている値の範囲を知っていますか?0〜10の範囲の値があるとします。次に、配列を事前計算できます。

sqrt_val[0] = 0;
sqrt_val[1] = 1;
sqrt_val[2] = // the sqrt of 2
...
sqrt_val[10] = // the sqrt of 10

次に、実行時にsqrtが必要な数値を取得し、それを整数に変換し(たとえば、3.123は3になります)、それをインデックス(3)として使用して、事前に計算された値を検索します。

もちろん、より細かい解像度が必要な場合は、配列内のアイテムの数を増やすことができます。

于 2010-09-16T01:03:19.953 に答える
3

まず、平方根が実際にボトルネックになっていると確信していますか? プロファイリングしましたか?1/30 秒ごとに 2000 平方根というのは、携帯電話でも、実際にはそれほど多くはありません。ARM のドキュメントでは、単精度の平方根で 33 サイクル、倍精度で 60 サイクルと記載されています。600mHz のプロセッサは、 1 秒あたり1000 万平方根を実行できます (命令がパイプライン化されている場合は、それ以上)。

プロファイリングを行い、平方根が実際にボトルネックである場合は、NEONvrsqrte.f32命令を使用することをお勧めします。この命令は非常に高速で、4 つの浮動小数点数のおおよその逆平方根を同時に提供します。次に、vmul.f32命令を使用して近似平方根を取得できます (ただし、多くの用途では、平方根自体よりも逆数の方が便利です)。

于 2010-09-16T03:31:25.000 に答える
2

たぶんこれはあなたのためです:
高速逆平方根
この方法が必要な精度を提供しない場合は、速度と精度の間で多かれ少なかれ正確を選択できる他の反復法もたくさんあります:
平方根を計算する方法

于 2010-09-16T01:01:51.193 に答える
2

見積もりをどの程度正確にしますか?見積もりを実際の平方根にどれだけ近づけたいかがわかっている場合は、ニュートン法が友だちです。

sqrtに渡される値の範囲を知っていますか?もしそうなら、起動時に事前に計算されたルックアップテーブルを作成することができます(または、何がより高速であるかによっては、起動時にディスクから読み取ることもできます)。テーブル内で入力に最も近いものを見つけて、見積もりを取得します。

于 2010-09-16T01:03:32.127 に答える
2

iPhoneで行うことができる最も簡単な変更は、sqrt()の代わりにsqrtf()を使用することです。単精度浮動小数点演算は、特に3GSヴィンテージ以降のデバイスでは、倍精度よりもはるかに高速です。

于 2010-09-16T02:17:53.253 に答える
2

ピタゴラスの三角形 (sqrt(x*x + y*y)) を計算するために平方根が必要で、x と y の両方が非負である場合、それに対する非常に高速な近似は次のとおりです。

max(x,y) + min(x,y)*0.333

これには最大 5.7% の誤差があります。ただし、min() と max() での分岐予測の誤りに注意してください。

于 2013-12-05T22:28:41.887 に答える
0

グーグルですばやく検索すると、あらゆる種類のリンクが見つかります。

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

http://www.azillionmonkeys.com/qed/sqroot.html

于 2010-09-16T00:59:18.937 に答える
0

intではなく「通常の」正のfloatまたはdoubleがあり、テーブルルックアップメソッドを使用する場合は、2つの別々のテーブルルックアップを実行できます。1つは指数(再バイアス)用で、もう1つは仮数の数ビット(シフトおよびマスクビットフィールド抽出)、次に2つのテーブルルックアップ結果を乗算します。

于 2010-09-16T04:36:27.020 に答える