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 サイトの他の関連記事を参照してください。