> 백엔드 개발 > Golang > Go에서 변수와 리터럴을 비교할 때 부동 소수점 동등성이 실패하는 이유는 무엇입니까?

Go에서 변수와 리터럴을 비교할 때 부동 소수점 동등성이 실패하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-24 05:34:20
원래의
648명이 탐색했습니다.

Why Does Floating-Point Equality Fail in Go When Comparing Variables and Literals?

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
로그인 후 복사

동일한 부동 소수점 연산이 수행되는 동안 선언된 변수(x) 또는 리터럴을 사용하여 (10.1), 동등성 검사에 실패합니다.

차이점

이 동작을 이해하려면 Go의 부동 소수점 숫자 처리를 자세히 살펴봐야 합니다. 상수 및 숫자 리터럴은 처음에는 유형이 지정되지 않았으며 더 높은 수준을 갖습니다. 그러나 변수에 할당되거나 유형 변환되면 대상 유형의 제한 사항을 상속합니다.

x := 10.1이 할당되면 리터럴 10.1은 float로 변환되기 때문에 일부 정밀도를 잃습니다. 반대로 10.1*3.0은 계산 시 전체 정밀도를 유지합니다. 이는 관찰된 값의 차이와 잘못된 동등성 검사를 설명합니다.

문서 및 이론적 근거

이 동작은 Go 블로그 게시물의 "Floats" 섹션에 설명되어 있습니다. 상수:

"숫자 상수는 임의의 정밀도 숫자 공간에 존재합니다. 이는 단지 일반 숫자일 뿐입니다. 변수에 할당된 값은 대상에 맞을 수 있어야 합니다."

이 동작의 메커니즘은 특히 상수가 매우 큰 경우 다소 모호하지만, Go의 부동 소수점 표현. 이러한 지식을 통해 개발자는 코드의 정밀도 관련 문제를 효과적으로 예측하고 처리할 수 있습니다.

위 내용은 Go에서 변수와 리터럴을 비교할 때 부동 소수점 동등성이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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