ホームページ > バックエンド開発 > Golang > Go で変数とリテラルを比較するときに浮動小数点の等価性が失敗するのはなぜですか?

Go で変数とリテラルを比較するときに浮動小数点の等価性が失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-12-24 05:34:20
オリジナル
605 人が閲覧しました

Why Does Floating-Point Equality Fail in Go When Comparing Variables and Literals?

Go の浮動小数点精度: リテラルと変数の違いを理解する

矛盾

Go では、次のコード スニペットは、浮動小数点の興味深い違いを明らかにします。計算:

package main

import (
    "fmt"
)

func main() {
    x := 10.1
    fmt.Println("x == 10.1:        ", x == 10.1)
    fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
}
ログイン後にコピー

このコードを実行すると、予期しない結果が生成されます:

x == 10.1:         true
x*3.0 == 10.1*3.0: false
ログイン後にコピー

宣言された変数 (x) またはリテラルを使用して、同じ浮動小数点演算が実行されます(10.1)、等価性チェックは失敗します。

の起源違い

この動作を理解するには、Go による浮動小数点数の処理を詳しく調べる必要があります。定数と数値リテラルは、最初は型指定されておらず、無制限の精度を持っています。ただし、変数に代入する場合、または型変換を行う場合は、宛先の型の制限を継承します。

x := 10.1 が代入されると、float への変換によりリテラル 10.1 の精度がいくらか失われます。逆に、10.1*3.0 は計算において完全な精度を維持します。これは、観察された値の違いと誤った等価性チェックを説明しています。

ドキュメントと根拠

この動作については、Go のブログ投稿の「Floats」セクションで概説されています。 constants:

"数値定数は任意精度の数値空間に存在します。ただの通常の数値ですが、変数に代入する場合は、その値が宛先に収まる必要があります。"

この動作の背後にあるメカニズム、特に非常に大きな定数の場合はまだ不明瞭です。 Go における浮動小数点表現の複雑さについての貴重な洞察を提供します。この知識により、開発者はコード内の精度関連の問題を効果的に予測して処理できるようになります。

以上がGo で変数とリテラルを比較するときに浮動小数点の等価性が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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