>백엔드 개발 >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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.