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

Go で浮動小数点数を正確かつ効率的に比較するにはどうすればよいですか?

DDD
リリース: 2024-12-17 21:03:12
オリジナル
580 人が閲覧しました

How Can I Accurately and Efficiently Compare Floating-Point Numbers in Go?

Go Float 比較: より正確で効率的なアプローチ

Go で 2 つの浮動小数点数 (float64) が等しいかどうかを比較するタスク通常、IEEE 754 の複雑さと浮動小数点のバイナリ表現の処理が含まれます。さまざまなアプローチがありますが、バイナリ表現を 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 つの数値を減算してその差を求めることです。

package main

import (
    "fmt"
    "math"
)

const float64EqualityThreshold = 1e-9

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}

func main() {
    a := 0.1
    b := 0.2
    fmt.Println(almostEqual(a + b, 0.3))
}
ログイン後にコピー

このアプローチは、最大許容差のしきい値を設定し、浮動小数点の等しいかどうかの比較が必要な最も実用的なシナリオに適しています。 。バイナリ表現を比較するよりも正確で効率的なソリューションが提供されます。

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

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