불일치
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
동일한 부동 소수점 연산이 수행되는 동안 선언된 변수(x) 또는 리터럴을 사용하여 (10.1), 동등성 검사에 실패합니다.
차이점
이 동작을 이해하려면 Go의 부동 소수점 숫자 처리를 자세히 살펴봐야 합니다. 상수 및 숫자 리터럴은 처음에는 유형이 지정되지 않았으며 더 높은 수준을 갖습니다. 그러나 변수에 할당되거나 유형 변환되면 대상 유형의 제한 사항을 상속합니다.
x := 10.1이 할당되면 리터럴 10.1은 float로 변환되기 때문에 일부 정밀도를 잃습니다. 반대로 10.1*3.0은 계산 시 전체 정밀도를 유지합니다. 이는 관찰된 값의 차이와 잘못된 동등성 검사를 설명합니다.
문서 및 이론적 근거
이 동작은 Go 블로그 게시물의 "Floats" 섹션에 설명되어 있습니다. 상수:
"숫자 상수는 임의의 정밀도 숫자 공간에 존재합니다. 이는 단지 일반 숫자일 뿐입니다. 변수에 할당된 값은 대상에 맞을 수 있어야 합니다."
이 동작의 메커니즘은 특히 상수가 매우 큰 경우 다소 모호하지만, Go의 부동 소수점 표현. 이러한 지식을 통해 개발자는 코드의 정밀도 관련 문제를 효과적으로 예측하고 처리할 수 있습니다.
위 내용은 Go에서 변수와 리터럴을 비교할 때 부동 소수점 동등성이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!