Go/0.0
表示
< Go
Goにおける 数値リテラル 0.0 は、「浮動小数点型のゼロ値」 として重要な役割を果たします。整数の 0 とは異なる特性を持ち、浮動小数点数特有の振る舞いを示します。
var f float64 = 0.0 // float64型の0.0 var g float32 = 0.0 // float32型の0.0 var h = 0.0 // 型推論により float64
var i int = 0 // 整数型のゼロ値 var f float64 = 0.0 // 浮動小数点型のゼロ値 var mixed float64 = 0 // 整数リテラルも浮動小数点型の初期値に使用可能
Goでは、浮動小数点型の変数を宣言した時点で暗黙的に初期化される値 が 0.0 です。
浮動小数点型のゼロ値
[編集]例: ゼロ値の自動初期化
[編集]var temperature float64 // temperature == 0.0 var price float32 // price == 0.0 var ratio float64 // ratio == 0.0
- 正のゼロと負のゼロ
var positiveZero float64 = 0.0 var negativeZero float64 = -0.0 fmt.Println(positiveZero == negativeZero) // true(等価性チェック) fmt.Println(math.Signbit(positiveZero)) // false fmt.Println(math.Signbit(negativeZero)) // true
- IEEE 754標準に従い、
+0.0と-0.0は異なる表現を持ちますが、等価性チェックでは同じとして扱われます - ゼロ除算の特別な処理
var zero float64 = 0.0 fmt.Println(1.0 / zero) // +Inf(正の無限大) fmt.Println(-1.0 / zero) // -Inf(負の無限大) fmt.Println(0.0 / zero) // NaN(非数)
- 浮動小数点数のゼロ除算は実行時エラーにならず、特殊値を返します
- 無限小の比較
var epsilon float64 = 1e-10 var zero float64 = 0.0 fmt.Println(epsilon > zero) // true fmt.Println(epsilon == zero) // false
- 数値計算の初期値
sum := 0.0 // 合計値の初期化 average := 0.0 // 平均値の初期化
- 閾値との比較
threshold := 1e-9 if math.Abs(result - expected) < threshold { // 浮動小数点数の近似的な等価性チェック }
- 配列・スライスの初期化
data := make([]float64, 10) // 全要素が0.0で初期化
注意点とベストプラクティス
[編集]浮動小数点の精度問題
[編集]var a float64 = 0.1 + 0.2 var b float64 = 0.3 fmt.Println(a == b) // false(浮動小数点誤差) fmt.Println(a) // 0.30000000000000004
0.0との比較時も浮動小数点誤差に注意が必要です
NaN と無限大の検出
[編集]if math.IsNaN(value) { // NaN の処理 } if math.IsInf(value, 0) { // 無限大の処理 }
型変換時の注意
[編集]var i int = 0 var f float64 = float64(i) // 明示的な型変換 // var f float64 = i // エラー:暗黙的な型変換は不可
他の言語との比較
[編集]C言語
[編集]Python
[編集]Go
[編集]0.0は厳密に浮動小数点型- 型安全性が高く、意図しない型変換を防げる
まとめ
[編集]- Goの
0.0は 「浮動小数点型のゼロ値」 であり、IEEE 754標準に準拠した振る舞いを示します - 整数の
0とは明確に区別され、型システムの安全性に貢献しています - 浮動小数点数特有の正のゼロ・負のゼロ、ゼロ除算時の特殊値処理など、数値計算における重要な概念を理解する上で重要です
- 精度問題や型変換に注意しながら使用することで、安全で正確な数値計算を実現できます
「0.0 は単なる浮動小数点のゼロではなく、Goの 『型安全性』と『数値計算の正確性』を両立させる重要な要素」として位置付けられます!
| ゼロ値 | |
|---|---|
float32 |
0.0
|
float64 |
0.0
|
complex64 |
(0+0i)
|
complex128 |
(0+0i)
|