+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package math
+
+func sign[I int32 | int64](a, b I) int {
+ if a < b {
+ return -1
+ }
+ if a > b {
+ return 1
+ }
+ return 0
+}
+
+// Compare compares a and b such that
+// -NaN is ordered before any other value,
+// +NaN is ordered after any other value,
+// and -0 is ordered before +0.
+// In other words, it defines a total order over floats
+// (according to the total-ordering predicate in IEEE-754, section 5.10).
+// It returns 0 if a == b, -1 if a < b, and +1 if a > b.
+func Compare(a, b float64) int {
+ // Perform a bitwise comparison (a < b) by casting the float64s into an int64s.
+ x := int64(Float64bits(a))
+ y := int64(Float64bits(b))
+
+ // If a and b are both negative, flip the comparison so that we check a > b.
+ if x < 0 && y < 0 {
+ return sign(y, x)
+ }
+ return sign(x, y)
+}
+
+// Compare32 compares a and b such that
+// -NaN is ordered before any other value,
+// +NaN is ordered after any other value,
+// and -0 is ordered before +0.
+// In other words, it defines a total order over floats
+// (according to the total-ordering predicate in IEEE-754, section 5.10).
+// It returns 0 if a == b, -1 if a < b, and +1 if a > b.
+func Compare32(a, b float32) int {
+ // Perform a bitwise comparison (a < b) by casting the float32s into an int32s.
+ x := int32(Float32bits(a))
+ y := int32(Float32bits(b))
+
+ // If a and b are both negative, flip the comparison so that we check a > b.
+ if x < 0 && y < 0 {
+ return sign(y, x)
+ }
+ return sign(x, y)
+}