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