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) fmt.Println("x*3.0: ", x*3.0) fmt.Println("10.1*3.0: ", 10.1*3.0) }
이 코드가 실행되면 다음 출력이 표시됩니다.
x == 10.1: true x*3.0 == 10.1*3.0: false x*3.0: 30.299999999999997 10.1*3.0: 30.3
출력에서 볼 수 있듯이 x*3.0과 10.1*3.0을 비교하면 예기치 않게 false로 평가됩니다. 이로 인해 이러한 불일치가 발생하는 이유와 이것이 의도적인 것인지 아니면 버그인지에 대한 의문이 제기됩니다.
디자인 이해
Go에서 부동 소수점 리터럴과 상수는 무제한의 정밀도를 갖습니다. . 그러나 유형이 지정된 변수에 할당되면 대상 유형의 범위에 따라 정밀도가 제한됩니다. 위의 예에서 x := 10.1은 float64 변수에 리터럴 10.1을 저장합니다. 이 변환에서는 float64 유형의 제한으로 인해 정밀도가 일부 손실됩니다.
반면, 10.1*3.0 표현식은 리터럴에서 직접 부동 소수점 곱셈을 수행하여 전체 정밀도를 유지합니다. 이는 x의 감소된 정밀도가 계산에 영향을 미치는 x*3.0과 비교하여 약간 다른 값을 가져옵니다.
문서 및 리소스
공식 Go 문서에서는 이를 인정합니다. 상수 문서의 "Floats" 섹션에 있는 동작입니다. 숫자 상수에는 임의의 정밀도가 있지만 할당 시 대상 유형에 맞아야 한다고 설명합니다. 1e1000과 같은 큰 값은 다른 상수와 함께 표현식에 사용할 수 있지만 결과가 더 좁은 유형으로 저장되면 정확도에 영향을 미칠 수 있습니다.
이 기사에서는 예제에서 관찰된 특정 동작을 명시적으로 언급하지 않지만 (x*3.0 대 10.1*3.0), 상수 및 유형 변수에 정밀도 제한이 어떻게 적용되는지에 대한 일반적인 이해를 제공합니다.
위 내용은 Go에서 부동 소수점 비교가 리터럴과 변수에 대해 다른 결과를 산출하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!