Go의 부동 소수점 정밀도 차이: 상수와 변수
Go에서 부동 소수점 리터럴과 상수는 할당될 때까지 임의의 정밀도를 유지합니다. 특정 유형으로. 그러나 특정 작업 및 할당에서는 예상치 못한 정밀도 차이가 발생합니다.
다음 코드를 고려하세요.
package main import ( "fmt" ) func main() { x := 10.1 fmt.Println("x == 10.1: ", x == 10.1) fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0) }
이 코드는 출력을 생성합니다.
x == 10.1: true x*3.0 == 10.1*3.0: false
왜 동일한 부동 소수점 연산을 수행함에도 불구하고 이러한 표현식은 동일하지 않습니까?
유형이 지정되지 않은 상수 및 변수
Go의 숫자 리터럴과 상수는 형식이 없으며 정밀도가 무제한입니다. x := 10.1과 같은 변수에 할당하면 리터럴이 변수 유형(이 경우 float64)으로 변환되고 일부 정밀도가 손실됩니다.
전체 정밀도 상수
반대로 10.1*3.0과 같은 리터럴 표현식은 평가 전에 완전한 정밀도를 유지합니다. 변수에 할당되면 즉시 변수 유형으로 변환되어 정밀도가 유지됩니다.
정밀도 고려 사항
정밀도 처리의 차이점을 이해하는 것이 중요할 수 있습니다. 정확한 부동 소수점 계산. 예를 들어 값을 지정된 허용오차와 비교할 때 거짓양성을 피하기 위해 리터럴이나 표현식을 완전한 정밀도로 사용하는 것이 중요합니다.
문서
이 동작은 좋습니다. -Go 블로그 기사 "Floats" 헤더 아래의 "상수"에 문서화되어 있습니다. 이는 숫자 상수가 임의의 정밀도를 가지지만 변수 범위 내에 맞아야 한다고 설명합니다.
결론
Go에서 부동 소수점 상수와 변수의 정밀도 차이는 설계에 따른 것이므로 더 큰 유연성과 성능 교환이 가능합니다. 부동 소수점 연산에서는 꺼집니다. 프로그래머는 이러한 정밀도 차이를 이해함으로써 코드의 정확성과 효율성을 최적화할 수 있습니다.
위 내용은 Go에서 부동 소수점 비교가 때때로 예상치 못한 결과를 낳는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!