この記事のURL

http://www.dango-itimi.com/blog/archives/2006/000863.html


FLASH tips まるめ虫

円と線との衝突判定処理等で、どうも期待する結果が得られない場合があり、traceを書きまくって検証しおりました。traceウインドウでは変数Aの値と変数Bの値とが同値にもかかわらず、比較を行うとfalseを返す場合があるのです。なんだこりゃあっ と何時間も頭を沸騰させておりました。

そういえば OH! DANGO! JAM でもデータの妥当性チェックの時に、小数点以下の数値を含む変数が同値にもかかわらず比較を行うとfalseを返す場合がありました。

ここで以前どこかで見た「まるめ虫」について思い出し、検索。

F-site
まるめ虫
二星まるめ虫

恐らく上記まるめ虫に近い現象が起こっているのだろうと思い、Math.roundで変数を囲うことにより数値の比較がようやく期待する結果を返すようになりました。
traceウインドウ上では整数として表示されていても、小数点以下の数値を含んでいる場合があるということなのですかなあ。そうならば、やっかいです。

物理計算においての数値の比較には注意が必要ですね。

以下雑記。

現在は今まで作成していた交差判定メソッドなど全て作り直しております。(バグも結構ありました…)
今までObjectクラスにダイナミックにプロパティを追加し、それを点や線や円やベクトルを示すものとして処理してきましたが、それぞれ独立したクラスにしたほうが便利だと感じ、PointクラスやVectorクラスといった各専用のクラスを作成中です。独自の簡易geomパッケージを作成する方針で進めています。

追記)
ああ、でも実際に小数点を含むデータの比較の場合、Math.roundで丸めてしまうとまた問題がでますなあ… どうしよう。表示の誤差がでない範囲で、小数点以下3桁以降は切り捨てといった処理を行えばいいのだろうか。

[ FLASH ] [ tips ] 投稿者 siratama : 2006年03月08日 00:29

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/823

コメント

はじめまして.いつも RSS リーダで拝見しています.数値計算では EPS とかを定義して比較を行ってました.

var EPS = 1.0e-10; // 必要な精度を定義

if( Math.abs( a - b ) < EPS){
// a と b は同値として処理
}

C ではこんな感じです.

ベアストウ法の数値計算例
http://www.geocities.jp/supermisosan/bairstow.html
#define eps 1.0e-10 //精度決定定数

ここの例では収束判定に使ってますが.

ActionScriptの浮動小数精度っていくつなんですかねぇ.

的はずれなコメントでしたらすいません.

投稿者 fin : 2006年03月08日 16:58

finさんどうもはじめまして、コメントありがとうございます!

おおお そのような手が…!
差分が指定精度よりも小さい場合同値としてみなす、という比較法なのですね。
うむむ、大変勉強になりました。ベアストウ法の数値計算例というものも参考にさせていただきます。
以前どこかの参考にしたサンプルプログラムに精度パラメータとして、そのEPSのような設定が行われていたのですが、何であるかはよく理解しておりませんでした。しかしこれで納得です。感謝いたします。

投稿者 siratama : 2006年03月09日 02:12

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]