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