Rob Pike | 1a13f9b | 2011-09-29 09:54:20 -0700 | [diff] [blame] | 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. |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 8 | // |
| 9 | // Special cases are: |
| 10 | // Dim(+Inf, +Inf) = NaN |
| 11 | // Dim(-Inf, -Inf) = NaN |
| 12 | // Dim(x, NaN) = Dim(NaN, x) = NaN |
Russ Cox | dd8dc6f | 2011-12-13 15:20:12 -0500 | [diff] [blame] | 13 | func Dim(x, y float64) float64 |
| 14 | |
| 15 | func dim(x, y float64) float64 { |
| 16 | return max(x-y, 0) |
Rob Pike | 1a13f9b | 2011-09-29 09:54:20 -0700 | [diff] [blame] | 17 | } |
| 18 | |
| 19 | // Max returns the larger of x or y. |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 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 |
Russ Cox | dd8dc6f | 2011-12-13 15:20:12 -0500 | [diff] [blame] | 26 | func Max(x, y float64) float64 |
| 27 | |
| 28 | func max(x, y float64) float64 { |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 29 | // special cases |
| 30 | switch { |
Luuk van Dijk | 8dd3de4 | 2012-02-01 16:08:31 +0100 | [diff] [blame] | 31 | case IsInf(x, 1) || IsInf(y, 1): |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 32 | return Inf(1) |
Luuk van Dijk | 8dd3de4 | 2012-02-01 16:08:31 +0100 | [diff] [blame] | 33 | case IsNaN(x) || IsNaN(y): |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 34 | return NaN() |
| 35 | case x == 0 && x == y: |
| 36 | if Signbit(x) { |
| 37 | return y |
| 38 | } |
| 39 | return x |
| 40 | } |
Rob Pike | 1a13f9b | 2011-09-29 09:54:20 -0700 | [diff] [blame] | 41 | if x > y { |
| 42 | return x |
| 43 | } |
| 44 | return y |
| 45 | } |
| 46 | |
| 47 | // Min returns the smaller of x or y. |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 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 |
Russ Cox | dd8dc6f | 2011-12-13 15:20:12 -0500 | [diff] [blame] | 53 | func Min(x, y float64) float64 |
| 54 | |
| 55 | func min(x, y float64) float64 { |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 56 | // special cases |
| 57 | switch { |
Luuk van Dijk | 8dd3de4 | 2012-02-01 16:08:31 +0100 | [diff] [blame] | 58 | case IsInf(x, -1) || IsInf(y, -1): |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 59 | return Inf(-1) |
Luuk van Dijk | 8dd3de4 | 2012-02-01 16:08:31 +0100 | [diff] [blame] | 60 | case IsNaN(x) || IsNaN(y): |
Charles L. Dorian | e4de2e7 | 2011-12-07 14:52:17 -0500 | [diff] [blame] | 61 | return NaN() |
| 62 | case x == 0 && x == y: |
| 63 | if Signbit(x) { |
| 64 | return x |
| 65 | } |
| 66 | return y |
| 67 | } |
Rob Pike | 1a13f9b | 2011-09-29 09:54:20 -0700 | [diff] [blame] | 68 | if x < y { |
| 69 | return x |
| 70 | } |
| 71 | return y |
| 72 | } |