C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

平方根を高速で求める方法 /顔万谷 (17/12/03(Sun) 16:14) #85929
Re[1]: 平方根を高速で求める方法 /774RR (17/12/03(Sun) 17:58) #85930
Re[1]: 平方根を高速で求める方法 /furu (17/12/04(Mon) 11:29) #85934
  └ Re[2]: 平方根を高速で求める方法 /ぶなっぷ (17/12/05(Tue) 08:57) #85947


親記事 / ▼[ 85930 ] ▼[ 85934 ]
■85929 / 親階層)  平方根を高速で求める方法
□投稿者/ 顔万谷 (1回)-(2017/12/03(Sun) 16:14:01)

分類:[.NET 全般] 


二点間の距離を求めるために
sqrt( a*a + b*b )

という計算を何度も行うため、
多少、精度が悪くても良いので高速に行いたいのですが
検索すると結構、高速化のアルゴリズムが書かれたページが見つかります。

http://www.geocities.co.jp/SiliconValley-PaloAlto/5438/sqrt.htm

例えば、このページには

  u_long sqrt2(u_long f)
  {
    u_long s = f,t;
    
     if(x == 0) return 0;
    do
    {
      t = s;
      s = (t + f / t) >> 1;
    }while(s < t);
    return t;
  }


というコードが書かれていますが
これをVBで書き換えるとどうなりますか?

自分でやろうとしたのですが
 if(x == 0)
という分岐が出てくるのに
その前にxが宣言されていないので
どうすれば良いか分かりませんでした。




[ □ Tree ] 返信 編集キー/

▲[ 85929 ] / 返信無し
■85930 / 1階層)  Re[1]: 平方根を高速で求める方法
□投稿者/ 774RR (576回)-(2017/12/03(Sun) 17:58:07)
通常 x86 では float/double の sqrt は1命令なので、何も考えずに Math.Sqrt() を使うのが最速。
真に距離ではなくて、近い遠いの判断だけでよいのなら Sqrt() もいらないよ

[ 親 85929 / □ Tree ] 返信 編集キー/

▲[ 85929 ] / ▼[ 85947 ]
■85934 / 1階層)  Re[1]: 平方根を高速で求める方法
□投稿者/ furu (141回)-(2017/12/04(Mon) 11:29:12)
No85929 (顔万谷 さん) に返信
> 自分でやろうとしたのですが
>  if(x == 0)
> という分岐が出てくるのに
> その前にxが宣言されていないので
> どうすれば良いか分かりませんでした。

s = (t + f / t) >> 1;で
t=0だとゼロ割しちゃうから
if(x == 0) return 0;は
if(s == 0) return 0;の間違いかと思います。

コプロセッサ持ってないPlayStationの話なので
774RRさん書かれているMath.Sqrt()と較べて見てはどうですか。
[ 親 85929 / □ Tree ] 返信 編集キー/

▲[ 85934 ] / 返信無し
■85947 / 2階層)  Re[2]: 平方根を高速で求める方法
□投稿者/ ぶなっぷ (147回)-(2017/12/05(Tue) 08:57:45)
この手の話は経験上、毎回の sqrt( a*a + b*b ) を速くするより、
式の簡略化の方が効果が大きいです。

例えば、複数の2点間の距離のうち、最小となる2点を求めるなら、
a*a + b*b の結果を比較すれば十分。

なぜなら、a*a + b*b が最小なら、sqrt( a*a + b*b )も最小と
決まっているから。

最小の2点が見つかった後、最後に画面に2点間の距離を表示する
際に sqrt() すれば良いです。

私の方は、上記の式の確認は行っておりませんが、
同じように簡略化できるか検討してみると良いです。

[ 親 85929 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -