まるめ虫
円と線との衝突判定処理等で、どうも期待する結果が得られない場合があり、traceを書きまくって検証しおりました。traceウインドウでは変数Aの値と変数Bの値とが同値にもかかわらず、比較を行うとfalseを返す場合があるのです。なんだこりゃあっ と何時間も頭を沸騰させておりました。
そういえば OH! DANGO! JAM でもデータの妥当性チェックの時に、小数点以下の数値を含む変数が同値にもかかわらず比較を行うとfalseを返す場合がありました。
ここで以前どこかで見た「まるめ虫」について思い出し、検索。
恐らく上記まるめ虫に近い現象が起こっているのだろうと思い、Math.roundで変数を囲うことにより数値の比較がようやく期待する結果を返すようになりました。
traceウインドウ上では整数として表示されていても、小数点以下の数値を含んでいる場合があるということなのですかなあ。そうならば、やっかいです。
物理計算においての数値の比較には注意が必要ですね。
以下雑記。
現在は今まで作成していた交差判定メソッドなど全て作り直しております。(バグも結構ありました…)
今までObjectクラスにダイナミックにプロパティを追加し、それを点や線や円やベクトルを示すものとして処理してきましたが、それぞれ独立したクラスにしたほうが便利だと感じ、PointクラスやVectorクラスといった各専用のクラスを作成中です。独自の簡易geomパッケージを作成する方針で進めています。
追記)
ああ、でも実際に小数点を含むデータの比較の場合、Math.roundで丸めてしまうとまた問題がでますなあ… どうしよう。表示の誤差がでない範囲で、小数点以下3桁以降は切り捨てといった処理を行えばいいのだろうか。
はじめまして.いつも 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