| // 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) |
| } |