ホームページ >バックエンド開発 >Golang >精度の損失は Go の float64 から uint64 への変換にどのような影響を与えますか?

精度の損失は Go の float64 から uint64 への変換にどのような影響を与えますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-10 14:49:16415ブラウズ

How Does Precision Loss Affect Go's float64 to uint64 Conversion?

Float64 から Uint64 への変換について

Go では、float64 を uint64 に変換するには、float64 を uint64 データ型にキャストする必要があります。の違いにより予期しない動作が発生する

次の例を考えてみましょう:

package main

func main() {
    n := float64(6161047830682206209)
    println(uint64(n))
}

出力は次のとおりです:

6161047830682206208

これは、uint64 値が同じであると予想されるため、直感に反しているように思えます。 float64 として。この不一致は、これらのデータ型の内部表現に起因します。

定数と浮動小数点数

Go の定数は任意の精度で表現されますが、浮動小数点数はIEEE 754 標準に従います。

IEEE 754 では、倍精度浮動小数点数 (64 ビット) は、数字用に 53 ビットを予約します。指定された例では:

6161047830682206209

数値が 53 ビット整数として表現可能な最大数値を超えています:

2^52        : 9007199254740992

したがって、定数は float64 として正確に表現できません。への変換中に数字が失われますuint64.

検証

これは、元の float64 値を出力することで検証できます:

fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

これは出力します:

6161047830682206208.000000
6161047830682206208

問題は変換自体にあるのではなく、float64 が元々使用されていたときの精度の損失にあります。

有効な変換の例

53 ビットを使用して正確に表現できる小さい数値の場合:

n := float64(7830682206209)
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

出力は次のようになります:

7830682206209.000000
7830682206209

この場合、float64 は次のようになります。正確に表現され、精度を損なうことなく uint64 に変換されます。

以上が精度の損失は Go の float64 から uint64 への変換にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。