Path: chuka.playstation.co.uk!news1.scei.co.jp!usenet From: "Sugihara Yoshimi" Newsgroups: playstation.ny.program.questions Subject: =?iso-2022-jp?B?UmU6IBskQiMyRUA0ViRONXdOJSRySWJGMD4uP3RFQCRyO0gbKEI=?= =?iso-2022-jp?B?GyRCJG8kOiRLNWEkYSRrSn1LIRsoQg==?= Date: Tue, 21 Apr 1998 00:04:01 +0900 Organization: PlayStation Net Yarouze Lines: 66 Message-ID: <6hfovp$p29@news1.scei.co.jp> References: <6hd9hg$m3d@news1.scei.co.jp> <353A5E63.9B98A698@mxz.meshnet.or.jp> NNTP-Posting-Host: 210.174.83.214 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Newsreader: Microsoft Outlook Express 4.71.1712.3 X-MimeOLE: Produced By Microsoft MimeOLE V4.71.1712.3 sugiharaです。 さっそくの回答ありがとうございます。 m(_ _)m >上を見るに キャストしてあるので sqrt が悪いのが理解できてるようですね。 >まず、1つ目はこのsqrtを返り値がlong型になるよう自分で書き直します。 > >long Lsqrt(long a){ > long s1,s2; > //エラー処理は省いてます。 > do{ > s2 = s; > s = (a / s + s)/2; > }while(s != s2); > return s; >} >です。しかし非常に制度が悪いです。 >Lsqrt(99) == 9ですわ。 >そこでもうひとつ >http://www02.so-net.ne.jp/~einsidle/reversible/ >内にある僕の作った3D版Hi-Jump demo(2D版もあるので間違えないでね) >にkotei2.cというソースコードがくっついてだいぶ前からアップされています。 >kotei2.cというのは固定小数点を扱うための関数です。 >固定小数点とは(僕も最近まで知らなかった)ある数字を1と考えます。 >kotei2.cでは4096を1と考えてます。 >例えば、(double)0.5は(long)2048です。 > >では実際に上のプログラムをkotei2.cを使って書き換えると > >//////////////////////////////////////////// > x = (px - qx) << 12;//固定小数点を使うため4096倍する > y = (py - qy) << 12;//固定小数点を使うため4096倍する > > r = Kotei_Sqrt( Kotei_Kakeru(x,x) + Kotei_Kakeru(y*y) ) ; > > c = Kotei_Waru(x , r); > s = Kotei_Waru(y , r); > > MATRIX mrx > 固定小数点が必要なくなったので4096で割る。 > mrx.m[0][0] =c>>12; mrx.m[0][1] = -(s >>12);mrx.m[0][2] = 0; > mrx.m[1][0] =s>>12; mrx.m[1][1] = c>>12 ;mrx.m[0][2] = 0; > mrx.m[2][0] = 0 ; mrx.m[2][1] = 0 ;mrx.m[0][2] = 1; >/////////////////////////////////////// >となりかなり高速化できるはずです。 >もちろん最後の「固定小数点が必要なくなったので4096で割る」は >その後も固定小数点を使うなら割る必要はないですし >cやsが4096以下なら0になるのでその後も固定小数点を使わないと >計算した意味がありません。 > >以上分かりにくい説明でしたが、ということです。 コードの書き方についてはお恥ずかしい限りです。いまはPentiumのコード をVisualC++から書くことが多いので、あまりコードの書き方で最適化する ことをしない癖がついてしまいました。(^^; ところで、sqrtの処理は、同じ質問を fj.lang.c でも聞いてみたと ころ、これが最適と思われる方法について教えていただきました。内容については ニュースを見ていただければと思います。(実は、処理している内容が良くわかんな いです。(^^;) 現在、教えていただいた方法でテストしているのですが、今のところよさそうで す。