Go の浮動小数点精度: float32 と float64
Go では、浮動小数点数は IEEE 754 バイナリ形式を使用して表現されます。この形式は、使用されるデータ型に応じてさまざまなレベルの精度を提供しますが、float32 は float64 よりも精度が低くなります。
次のコード スニペットを考えてみましょう。これは浮額误差を示しています。
package main import "fmt" func main() { a := float64(0.2) a += 0.1 a -= 0.3 var i int for i = 0; a < 1.0; i++ { a += a } fmt.Printf("After %d iterations, a = %e\n", i, a) }
When float64 を使用すると、プログラムは次のように正しく出力します。
After 54 iterations, a = 1.000000e+00
ただし、代わりに float32 を使用すると、プログラムは無限ループに入ります。これは、float32 が 10 進数値 0.1 を正確に表すことができず、わずかに丸められた値になるためです。この丸められた値により、ループが終了するのを防ぎます。
この違いを理解するには、関連する浮動小数点値のバイナリ表現を調べてください。
float32(0.1): 00111101110011001100110011001101 float32(0.2): 00111110010011001100110011001101 float32(0.3): 00111110100110011001100110011010 float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010 float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010 float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
float32 の 0.1 のバイナリ表現に注意してください。 float64 とは少し異なります。このわずかな違いにより、float32 型による値の異なる解釈が生じ、観察される動作が生じます。
要約すると、float32 を使用すると、近似値 0.1 がメモリに格納され、精度と精度に影響を与えます。浮動小数点演算の精度。対照的に、float64 は 10 進数値 0.1 をより正確に表現できるため、より正確な計算が可能になります。
以上がGo の浮動小数点精度: なぜ `float32` では無限ループが発生するのに、`float64` では無限ループが発生しないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。