It's OK to compare floating-points for equality
> Source: Hacker_News
Execute Primary Source
// Discussion Topic
浮動小数点数の比較において、定数イプシロンを用いる手法の妥当性と、数値計算における精度管理の限界。特に、値の大きさに応じて精度が変化する浮動小数点の特性を、いかにして比較アルゴリズムに組み込むべきかが問われている。
// Community Consensus
「定数イプシロンによる比較」は、ほとんどのケースで不適切であるという強い批判で一致している。値のスケールを無視した比較は、極端に大きな値や小さな値に対して機能しないためだ。コミュニティの総意としては、絶対誤差(Absolute Tolerance)と相対誤差(Relative Tolerance)を組み合わせたハイブリッドな手法、あるいはビットレベルの差を評価するULP比較を用いることが、実戦における正解であるとされている。
// Alternative Solutions
Pythonの`math.isclose`に代表される「絶対誤差と相対誤差の併用」、ULP(Unit in the Last Place)に基づく比較、およびビットキャストして整数として扱う手法が推奨されている。
// Technical Terms
Senior Engineer Insight
> 本議論は、数値計算の基礎に対する理解の欠如が、いかに致命的なバグを招くかを浮き彫りにしている。現場において「イプシロンで比較すれば良い」という安易な実装は、技術的負債どころか、システムの信頼性を根底から破壊する。特に、座標系が広大なゲームエンジンや、高精度な物理シミュレーション、金融計算を扱う場合、単一の閾値に頼る設計は厳禁だ。我々の開発基準としては、比較関数をブラックボックス化せず、ユーザーがエラーモデル(相対・絶対・ULP)を明示的に選択できる設計を標準とする。また、ライブラリ設計者は、単なる数学的正しさだけでなく、計算の「意図(Intention)」をどう許容するかという、より高次元な設計思想を持つべきである。