> 백엔드 개발 > Golang > Go 대 C: 부동 소수점 정밀도가 Go의 Float32에서는 무한 루프를 발생시키지만 C의 Double에서는 발생하지 않는 이유는 무엇입니까?

Go 대 C: 부동 소수점 정밀도가 Go의 Float32에서는 무한 루프를 발생시키지만 C의 Double에서는 발생하지 않는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-09 17:01:10
원래의
927명이 탐색했습니다.

Go vs. C: Why Does Floating-Point Precision Cause an Infinite Loop in Go's Float32 but Not in C's Double?

Go Lang 부동 소수점 정밀도: Float32 대 Float64

Go에서 부동 소수점 연산의 복잡성을 설명하려면 다음 프로그램을 고려하세요. 정밀도 효과:

func main() {
    a := float64(0.2)
    a += 0.1
    a -= 0.3
    var i int
    for i = 0; a < 1.0; i++ {
        a += a
    }
    fmt.Printf("After %d iterations, a = %e\n", i, a)
}
로그인 후 복사

이 프로그램은 다음에서 예상되는 동작을 나타냅니다. C double 유형을 사용하는 경우 인쇄:

After 54 iterations, a = 1.000000e+00
로그인 후 복사

그러나 Go에서 float32를 사용하는 경우 프로그램은 무한 루프에 들어갑니다. double 대신 float를 사용하도록 C 프로그램을 수정하면 다른 결과가 나옵니다.

After 27 iterations, a = 1.600000e+00
로그인 후 복사

이러한 불일치를 이해하려면 math.Float32bits 및 math.Float64bits를 사용하여 기본 바이너리 표현을 자세히 살펴보세요.

float32(0.1): 00111101110011001100110011001101
float32(0.2): 00111110010011001100110011001101
float32(0.3): 00111110100110011001100110011010
float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010
float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010
float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
로그인 후 복사

이 이진수 값을 십진수로 변환하면 float32의 경우 됩니다:

0.20000000298023224
+ 0.10000000149011612
- 0.30000001192092896
= -7.4505806e-9
로그인 후 복사

이 음수 값은 합이 1이 될 수 없으므로 무한 루프가 관찰됩니다.

반대로 C의 동작은 반올림 전략의 차이에서 비롯됩니다. Go는 마지막 비트를 반올림하고 C는 이를 잘라냅니다. 결과적으로 Go는 0.1을 가장 가까운 값으로 나타냅니다.

Go:   00111101110011001100110011001101 => 0.10000000149011612
C(?): 00111101110011001100110011001100 => 0.09999999403953552
로그인 후 복사

요약하면 Go와 C 모두 부동소수점에서 0.1을 정확하게 나타낼 수 없지만 Go는 가장 가까운 근사치를 사용하는 반면 C는 다음에 따라 다르게 처리할 수 있습니다. 구현.

위 내용은 Go 대 C: 부동 소수점 정밀도가 Go의 Float32에서는 무한 루프를 발생시키지만 C의 Double에서는 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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