質問:
Go の領域内浮動小数点演算、2 つの値が等しいかどうかを判断するために優れた精度と効率を提供するアプローチは何ですか
アプローチ 1: ビットレベルの比較
このアプローチでは、IEEE 754 浮動小数点数の数学的表現を利用して、次のことを確認します。ビット上の平等level:
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: イプシロンとの絶対差
従来のアプローチでは、2 つの浮動小数点数を減算し、絶対値を任意の許容誤差 (イプシロン、いつもの1e-9):
func almostEqual(a, b float64) bool { return math.Abs(a - b) <= float64EqualityThreshold }
分析:
ビットレベルの比較アプローチは、ハードウェア効率に優れているにもかかわらず、特定のシナリオでは誤った結果につながる可能性があります。
たとえば、2 つの非正規化浮動小数点数 (非正規指数を持つ浮動小数点) を比較すると、誤って次のことを示す可能性があります。暗黙的な先行ゼロの存在により、差がゼロでないにもかかわらず等しい。さらに、このアプローチは浮動小数点の大きさが大きくなるにつれて信頼性が低くなります。
対照的に、イプシロンベースのアプローチは非正規化浮動小数点を正しく処理します。絶対的な差分のみを考慮することで、ビットレベルの誤検知の可能性が排除され、広範囲の浮動小数点値にわたって一貫した等価性チェックが提供されます。
結論:
ビットレベルの比較は浮動小数点等価性に対する直感的なアプローチのように思えるかもしれませんが、汎用アプリケーションではイプシロンベースのアプローチがより汎用的で正確かつ効率的であることが証明されています。これにより、ビットレベル表現の落とし穴がなく、正確な等価性テストが保証されます。
以上がGo Float の等価性: ビット単位とイプシロンベースの比較 – どちらが優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。