Go: Float を比較するよりスマートな方法
IEEE 754 とバイナリ float 表現の複雑さを詳しく調べると、次のような問題に遭遇するかもしれません。いつまでも残る疑問: Go で 2 つの float を正確に比較して等しいかどうかを確認する方法。考えられるアプローチの 1 つは、次のような解決策を使用してビットレベルの違いを調べることです。
func Equal(a, b float64) bool { ba := math.Float64bits(a) bb := math.Float64bits(b) diff := ba - bb if diff < 0 { diff = -diff } return diff < 2 }
この方法は、単一ビットの違いを「ほぼ等しい」とみなして許容することを目的としています。ただし、このアプローチには制限があります。
より効果的なアプローチ
ビット操作に依存する代わりに、より信頼性の高い解決策は、2 つの数値を直接減算して、事前定義されたしきい値に対する絶対差。このアプローチはより直感的で正確です。
const float64EqualityThreshold = 1e-9 func almostEqual(a, b float64) bool { return math.Abs(a - b) <= float64EqualityThreshold }
優れている理由
この方法は、特定の状況で不正確な比較につながる可能性があるビット表現の落とし穴を回避します。 。数値の差を直接比較することで、精度と精度が向上します。さらに、ビットの違いを手動で検査する必要がなくなり、コードがより簡潔で保守しやすくなります。
要約すると、Go で浮動小数点数を比較する場合、推奨されるアプローチは 2 つの数値を減算し、絶対的な差を比較することです。事前定義されたしきい値。この方法は、ビット操作と比較して、「ほぼ等しい」ことを判断するためのより正確かつ効率的な方法を提供します。
以上がGo で浮動小数点数が等しいかどうかを正確に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。