>백엔드 개발 >Golang >Go에서 부동 소수점 숫자를 어떻게 정확하고 효율적으로 비교할 수 있나요?

Go에서 부동 소수점 숫자를 어떻게 정확하고 효율적으로 비교할 수 있나요?

DDD
DDD원래의
2024-12-17 21:03:12582검색

How Can I Accurately and Efficiently Compare Floating-Point Numbers in Go?

Go Float 비교: 더욱 정확하고 효율적인 접근 방식

Go에서 두 개의 부동 소수점 숫자(float64)가 동일한지 비교하는 작업 일반적으로 IEEE 754의 복잡성과 부동 소수점의 이진 표현을 다루는 작업이 포함됩니다. 다양한 접근 방식이 있지만 일부는 이진 표현을 1비트 허용오차와 비교하는 것이 신뢰할 수 있는 솔루션이라고 가정합니다.

func Equal(a, b float64) bool {
    ba := math.Float64bits(a)
    bb := math.Float64bits(b)
    diff := ba - bb
    if diff < 0 {
        diff = -diff
    }
    // accept one bit difference
    return diff < 2
}

그러나 이 접근 방식에는 한계가 있습니다. 부동 소수점 숫자의 이진 표현은 "거의 동일한" 값을 비교할 때 항상 의미가 있는 것은 아닙니다. 보다 직접적이고 정확한 방법은 두 숫자를 빼서 그 차이를 확인하는 것입니다.

package main

import (
    "fmt"
    "math"
)

const float64EqualityThreshold = 1e-9

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}

func main() {
    a := 0.1
    b := 0.2
    fmt.Println(almostEqual(a + b, 0.3))
}

이 접근 방식은 허용 가능한 최대 차이에 대한 임계값을 설정하며 부동 소수점의 동등성을 비교해야 하는 대부분의 실제 시나리오에 적합합니다. . 이진 표현을 비교하는 것보다 더 정확하고 효율적인 솔루션을 제공합니다.

위 내용은 Go에서 부동 소수점 숫자를 어떻게 정확하고 효율적으로 비교할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.