Golang 浮動小数点の不正確さを分析する

PHPz
リリース: 2023-04-06 10:06:52
オリジナル
820 人が閲覧しました

Golang は非常に人気のあるプログラミング言語であり、そのシンプルさ、効率性、セキュリティなどの特性により、クラウド コンピューティング、コンテナ化、ブロックチェーンなどの分野でのアプリケーションの基盤となっています。 Golang は 10 年の歴史がありますが、浮動小数点数の処理にいくつかの問題があり、この記事では Golang の浮動小数点数の不正確さについて分析します。

まず、浮動小数点数がどのように格納されるかを知る必要があります。 Golang は、最下位レベルで 64 ビット倍精度浮動小数点数 (float64) を使用して浮動小数点数を格納します。ここで、2 進数の一部は 10 進数を表し、2 進数の一部は整数を表します。コンピュータの内部浮動小数点数のバイナリ ストレージの精度には限界があるため、無理数実数を近似的に表すために使用できるのは限られた 2 進数のみであるため、丸め誤差が発生します。

たとえば、0.1 をバイナリ形式で表すと、0.0001 1001 1001 1001... が得られますが、丸め誤差により、コンピュータ内に実際に格納されるのは 0.0001 1001 1001 1001 1001 1001 1001 1010 になります。 ..., これにより、Golang が 0.1 を処理するときに奇妙な結果が発生します。

以下は、for ループを使用して 0.1 の小数点以下最初の 10 桁を出力する Golang コードの一部です:

package main

import "fmt"

func main() {
    var n float64 = 0.1
    for i := 0; i < 10; i++ {
        fmt.Println(n)
        n += 0.1
    }
}
ログイン後にコピー

期待される出力は次のとおりです:

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
ログイン後にコピー

ただし実際、出力結果は次のとおりです。

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
ログイン後にコピー

明らかに、Golang は 0.1 を正確に処理できませんが、0.30000000000000004 や 0.79999999999999999 のような結果が表示されます。これは、コンピュータ内部では、0.1 が 2 進数の無限ループとして近似的に表現されるためです。加算演算が実行されるたびに丸め誤差が増幅され、最終的には漸近誤差が生じます。

加算演算に加えて、減算、乗算、除算などの Golang の他の浮動小数点演算にも精度の問題があります。さらに、非常に大きいまたは非常に小さい浮動小数点数を扱う場合にも、オーバーフローまたはアンダーフローが発生する可能性があります。

これらの問題を回避するには、Golang が提供する math/big パッケージを使用して、大きな数値や高精度の浮動小数点数を処理できます。さらに、非常に正確な要件を必要とする一部のアプリケーション シナリオでは、C や Python などのプログラミング言語を使用して実装することを検討できます。

要約すると、Golang は浮動小数点数を処理するときに不正確になります。これは、コンピュータ内の丸め誤差が原因です。これらの問題を回避するには、特定のアプリケーションシナリオに応じて適切な開発言語とライブラリを選択し、計算結果の精度を確保する必要があります。

以上がGolang 浮動小数点の不正確さを分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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