Go'nun abs için neden özel bir kasası var (0)


9

Go ile oynuyordum ve matematik paketindeki abs işlevi için bu ilginç kodu buldum:

http://golang.org/src/pkg/math/abs.go

14 func abs(x float64) float64 {
15      switch {
16      case x < 0:
17          return -x
18      case x == 0:
19          return 0 // return correctly abs(-0)
20      }
21      return x
22  }

Neden x == 0 özel vakasına sahip olmalıyız? 18. ve 19. satırları silersem ne olur?

Yanıtlar:


16

Yorum nedeni açıklıyor - abs(-0)0 döndürmeli, ancak özel durum olmadan abs(-0)-0 dönecekti.

Go'nun IEEE şamandıralarını kullandığını ve böylece hem +0 hem de -0'ın işaret biti için farklı değerler kullanılarak temsil edilebileceğini varsayıyorum .


Tamam o zaman, ama 0 ve -0 hafızada aynı şekilde temsil edilmiyor mu?
user84386 14:13

6
@ user84386 - Go'nun IEEE şamandıralarını kullandığını varsayıyorum, bu yüzden bir işaret bitine sahip olacak, böylece hem +0 hem de -0 temsil edilebilir.
Lee

9

IEEE 754 kayan noktalı standart, imzalı sıfırlara izin verir . Negatif sıfır, pozitif sıfıra eşittir, bu nedenle < 0test tarafından kapsanmaz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.