> 백엔드 개발 > Golang > Go에서 부동 소수점 비교가 때때로 예상치 못한 결과를 낳는 이유는 무엇입니까?

Go에서 부동 소수점 비교가 때때로 예상치 못한 결과를 낳는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-04 11:33:09
원래의
778명이 탐색했습니다.

Why Do Floating-Point Comparisons in Go Sometimes Yield Unexpected Results?

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

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