Go에서 부동 소수점 숫자의 정밀도: float32와 float64
Go에서 부동 소수점 숫자는 IEEE를 사용하여 표현됩니다. 2진법의 754 이진 형식입니다. 부동 소수점 숫자의 정밀도는 가수를 나타내는 데 사용되는 비트 수를 나타내며, 이에 따라 정확도가 결정됩니다. 번호의. Go는 두 가지 일반적인 부동 소수점 유형인 float32와 float64를 제공합니다.
이러한 유형의 차이점은 정밀도에 있습니다. float32에는 23비트 가수가 있는 반면, float64에는 52비트 가수가 있습니다. 이렇게 높은 정밀도를 통해 float64는 float32에 비해 더 넓은 범위의 값과 더 높은 정확도를 표현할 수 있습니다.
이를 설명하기 위해 제공된 예를 고려해 보겠습니다.
func main() { a := float64(0.2) // Initializing a float64 variable 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) }
이 프로그램은 누적을 보여줍니다. 값에 대해 반복적인 작업을 수행할 때 부동 소수점 오류가 발생합니다. 이 경우 변수 'a'는 0.2의 값으로 초기화된 후 각각 0.1과 0.3의 값으로 덧셈과 뺄셈 연산을 수행한다. 이는 'a'가 1.0 이상이 될 때까지 반복됩니다.
float32와 float64를 함께 사용하여 이 프로그램을 실행하면 무한 루프에 들어갑니다. 이는 float32에서 0.1의 이진 표현이 실제 십진수 값과 약간 다르기 때문에 반올림 오류가 발생하기 때문입니다. 결과적으로 'a'의 값이 정확하게 누적되지 않고 루프가 무한정 계속됩니다.
반면 float64는 정밀도가 더 높아서 더 정확하게 값을 표현할 수 있습니다. 따라서 float64를 사용하는 동일한 프로그램은 'a'가 1.000000e 00에 도달하면 결국 루프를 종료합니다.
정밀도의 차이를 더 잘 이해하려면 math.Float32bits 및 math.Float64bits 함수를 사용하여 부동 소수점으로 변환할 수 있습니다. - 값을 이진 표현으로 가리킵니다. 이를 통해 비트 분포를 조사하고 float32와 float64 사이의 정밀도 차이의 원인을 식별할 수 있습니다.
위 내용은 Go의 float32 대 float64: 실제로 어느 정도의 정밀도가 필요한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!