ホームページ > バックエンド開発 > Golang > Go で浮動小数点数を効率的に比較してほぼ等しいかどうかを確認するにはどうすればよいですか?

Go で浮動小数点数を効率的に比較してほぼ等しいかどうかを確認するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-07 14:07:15
オリジナル
788 人が閲覧しました

How Can I Efficiently Compare Floating-Point Numbers for Near Equality in Go?

Go Float の比較: ほぼ等しいための効率的なアプローチ

Go では、2 つの float (float64) が等しいかどうかを比較するのは難しい作業になる場合がありますIEEE 754 浮動小数点表現の制限のため。従来の「abs(diff) < epsilon」法は近似値を提供しますが、不一致が生じる可能性があります。

提案された解決策: ビットレベルの比較

提案された解決策は、float64 値のビット単位の表現を比較することを提案します。その理論的根拠は、バイナリ表現における 1 ビットの違いがほぼ同等であることを保証するというものです。これより大きな違いは、異なる符号ビットまたは指数をもたらすことになります。

実装:

func Equal(a, b float64) bool {
    ba := math.Float64bits(a)
    bb := math.Float64bits(b)
    diff := ba - bb
    if diff < 0 {
        diff = -diff
    }
    // accept one bit difference
    return diff < 2
}
ログイン後にコピー

評価:

このアプローチでは有望に見えるかもしれませんが、次のような制限があります。

  • 精度の損失: ビットごとの比較は浮動小数点の精度を無視し、不正確になる可能性があります。
  • 一貫性のない結果: 特定のバイナリ表現によっては、このメソッドが常に一貫性のある結果を返すとは限りません。たとえば、大きさが同じで符号が異なる 2 つの浮動小数点数は、同じビット単位の表現を持つ可能性があります。

推奨される解決策: 浮動小数点減算

より信頼性が高く、ほぼ等しくなるための効率的なアプローチは、単純に 2 つの浮動小数点を減算し、その差が事前定義された値よりも小さいかどうかを確認することです。しきい値:

const float64EqualityThreshold = 1e-9

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}
ログイン後にコピー

このメソッドは、float の精度を維持し、一貫した結果を提供するため、float64 値をほぼ等しいかどうか比較するための堅牢なソリューションになります。

以上がGo で浮動小数点数を効率的に比較してほぼ等しいかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート