> 백엔드 개발 > Golang > Go에서 부동 소수점 비교가 리터럴과 변수에 대해 다른 결과를 산출하는 이유는 무엇입니까?

Go에서 부동 소수점 비교가 리터럴과 변수에 대해 다른 결과를 산출하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-09 15:04:16
원래의
750명이 탐색했습니다.

Why do floating-point comparisons in Go yield different results for literals and variables?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿