github.com/roboticscm/goman@v0.0.0-20210203095141-87c07b4a0a55/src/math/dim.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package math 6 7 // Dim returns the maximum of x-y or 0. 8 // 9 // Special cases are: 10 // Dim(+Inf, +Inf) = NaN 11 // Dim(-Inf, -Inf) = NaN 12 // Dim(x, NaN) = Dim(NaN, x) = NaN 13 func Dim(x, y float64) float64 14 15 func dim(x, y float64) float64 { 16 return max(x-y, 0) 17 } 18 19 // Max returns the larger of x or y. 20 // 21 // Special cases are: 22 // Max(x, +Inf) = Max(+Inf, x) = +Inf 23 // Max(x, NaN) = Max(NaN, x) = NaN 24 // Max(+0, ±0) = Max(±0, +0) = +0 25 // Max(-0, -0) = -0 26 func Max(x, y float64) float64 27 28 func max(x, y float64) float64 { 29 // special cases 30 switch { 31 case IsInf(x, 1) || IsInf(y, 1): 32 return Inf(1) 33 case IsNaN(x) || IsNaN(y): 34 return NaN() 35 case x == 0 && x == y: 36 if Signbit(x) { 37 return y 38 } 39 return x 40 } 41 if x > y { 42 return x 43 } 44 return y 45 } 46 47 // Min returns the smaller of x or y. 48 // 49 // Special cases are: 50 // Min(x, -Inf) = Min(-Inf, x) = -Inf 51 // Min(x, NaN) = Min(NaN, x) = NaN 52 // Min(-0, ±0) = Min(±0, -0) = -0 53 func Min(x, y float64) float64 54 55 func min(x, y float64) float64 { 56 // special cases 57 switch { 58 case IsInf(x, -1) || IsInf(y, -1): 59 return Inf(-1) 60 case IsNaN(x) || IsNaN(y): 61 return NaN() 62 case x == 0 && x == y: 63 if Signbit(x) { 64 return x 65 } 66 return y 67 } 68 if x < y { 69 return x 70 } 71 return y 72 }