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