Go における変数とリテラルの浮動小数点乗算: 精密パズル
Go では、浮動小数点リテラルと対応する変数の比較驚くべき結果が得られるかもしれません。次のコードを考えてみましょう:
x := 10.1 fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
乗算演算は同じですが、結果は false になります。なぜ矛盾があるのでしょうか?
定数と精度
Go の浮動小数点定数とリテラルは、無制限の精度を持っています。ただし、型付き変数に代入する場合、値は型の制約に準拠する必要があります。この場合、x は精度が制限された float64 に割り当てられます。
精度の維持
10.1*3.0 のように float リテラルを明示的に指定する場合、操作が実行される前に、完全な精度が維持されます。対照的に、float リテラルを変数に代入すると、ターゲット型への変換中に精度が失われます。
影響
この動作は仕様によるものであり、次のような影響があります。浮動小数点の比較。型付き変数をリテラル同等の変数と比較する場合、精度の違いにより予期しない結果が生じる可能性があります。定数に関する Go ブログ投稿に記載されているように、数値定数は制約のない数値空間に存在しますが、特定の型に割り当てると制限に直面します。
例
次のことを考えてください。 Go で宣言された定数:
const Huge = 1e1000
この定数は式内で使用できますが、式に割り当てることはできません。精度が高すぎるため、float64 変数を使用できません。したがって、ステートメント fmt.Println(Huge) はコンパイルに失敗します。
結論
リテラルと変数の間の浮動小数点乗算の不一致は、次の損失から生じます。型付き変数への代入時の精度。この動作を理解することは、予期しない結果を回避し、Go 浮動小数点演算で正確な比較を保証するために重要です。
以上がGo で浮動小数点乗算が変数とリテラルで異なる結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。