ホームページ > バックエンド開発 > Golang > Go の浮動小数点精度: なぜ `float32` では無限ループが発生するのに、`float64` では無限ループが発生しないのでしょうか?

Go の浮動小数点精度: なぜ `float32` では無限ループが発生するのに、`float64` では無限ループが発生しないのでしょうか?

DDD
リリース: 2024-12-24 14:56:11
オリジナル
459 人が閲覧しました

Go's Floating-Point Precision: Why Does `float32` Cause Infinite Loops While `float64` Doesn't?

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

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