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

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

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

Re[2]: 平方根を高速で求める方法


(過去ログ 147 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■85929 / inTopicNo.1)  平方根を高速で求める方法
  
□投稿者/ 顔万谷 (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が宣言されていないので
どうすれば良いか分かりませんでした。




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

引用返信 編集キー/
■85934 / inTopicNo.3)  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()と較べて見てはどうですか。
引用返信 編集キー/
■85947 / inTopicNo.4)  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() すれば良いです。

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

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -