ホームページ > バックエンド開発 > Golang > Go での浮動小数点比較で予期しない結果が生じる場合があるのはなぜですか?

Go での浮動小数点比較で予期しない結果が生じる場合があるのはなぜですか?

Patricia Arquette
リリース: 2024-12-04 11:33:09
オリジナル
663 人が閲覧しました

Why Do Floating-Point Comparisons in Go Sometimes Yield Unexpected Results?

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
ログイン後にコピー

理由同じ浮動小数点演算を実行しているにもかかわらず、これらの式は等しくありませんか?

型なし定数とGo の変数

数値リテラルと定数は型指定されておらず、精度は無制限です。 x := 10.1 などの変数に代入すると、リテラルは変数の型 (この場合は float64) に変換され、精度がいくらか失われます。

完全精度定数

対照的に、10.1*3.0 のようなリテラル式は、評価前に完全な精度を維持します。変数に代入されると、それらは直ちに変数の型に変換され、精度が維持されることが保証されます。

精度に関する考慮事項

精度の処理の違いを理解することは、正確な浮動小数点計算。たとえば、値を指定された許容値と比較する場合、誤検知を避けるためにリテラルまたは式を完全な精度で使用することが重要です。

Documentation

この動作は適切です。 - Go ブログ記事「Floats」ヘッダーの下の「Constants」に文書化されており、数値定数は任意の精度を持ちますが、適合する必要があることが説明されています。

結論

Go における浮動小数点定数と変数の精度の違いは設計によるもので、次のようなことが考慮されています。浮動小数点演算における柔軟性とパフォーマンスのトレードオフが向上します。これらの精度の違いを理解することで、プログラマーはコードを最適化して精度と効率を高めることができます。

以上がGo での浮動小数点比較で予期しない結果が生じる場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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