เหตุใด Go จึงมีเคสพิเศษสำหรับ abs (0)


9

ฉันเล่นกับ Go และพบรหัสที่น่าสนใจนี้สำหรับฟังก์ชัน abs ในแพ็คเกจคณิตศาสตร์:

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  }

ทำไมเราต้องมีกรณีพิเศษของ x == 0 จะเกิดอะไรขึ้นถ้าฉันลบบรรทัดที่ 18 และ 19

คำตอบ:


16

ความคิดเห็นอธิบายเหตุผล - abs(-0)ควรคืนค่า 0 แต่หากไม่มีกรณีพิเศษabs(-0)จะคืนค่า -0

ฉันถือว่า Go ใช้IEEE ลอยดังนั้นทั้ง +0 และ -0 สามารถแทนด้วยค่าที่แตกต่างกันสำหรับ bit sign


โอเค แต่ไม่ใช่ 0 และ -0 แสดงถึงวิธีเดียวกันในหน่วยความจำใช่ไหม
user84386

6
@ user84386 - ฉันถือว่า Go ใช้ IEEE float ดังนั้นมันจะมีเครื่องหมายบิตดังนั้นทั้ง +0 และ -0 จึงสามารถแทนค่าได้
Lee

9

มาตรฐาน IEEE 754 มาตรฐานจุดลอยตัวช่วยให้ศูนย์มีเครื่องหมาย ศูนย์ลบเท่ากับศูนย์บวกดังนั้นมันจะไม่ครอบคลุมโดยการ< 0ทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.