1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
package binaryop
import (
"math"
)
var nan = math.NaN()
// Eq returns true of left == right.
func Eq(left, right float64) bool {
// Special handling for nan == nan.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/150 .
if math.IsNaN(left) {
return math.IsNaN(right)
}
return left == right
}
// Neq returns true of left != right.
func Neq(left, right float64) bool {
// Special handling for comparison with nan.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/150 .
if math.IsNaN(left) {
return !math.IsNaN(right)
}
if math.IsNaN(right) {
return true
}
return left != right
}
// Gt returns true of left > right
func Gt(left, right float64) bool {
return left > right
}
// Lt returns true if left < right
func Lt(left, right float64) bool {
return left < right
}
// Gte returns true if left >= right
func Gte(left, right float64) bool {
return left >= right
}
// Lte returns true if left <= right
func Lte(left, right float64) bool {
return left <= right
}
// Plus returns left + right
func Plus(left, right float64) float64 {
return left + right
}
// Minus returns left - right
func Minus(left, right float64) float64 {
return left - right
}
// Mul returns left * right
func Mul(left, right float64) float64 {
return left * right
}
// Div returns left / right
func Div(left, right float64) float64 {
return left / right
}
// Mod returns mod(left, right)
func Mod(left, right float64) float64 {
return math.Mod(left, right)
}
// Pow returns pow(left, right) if left is not NaN. Otherwise NaN is returned.
func Pow(left, right float64) float64 {
// special case for NaN^any
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/7359
if math.IsNaN(left) {
return nan
}
return math.Pow(left, right)
}
// Atan2 returns atan2(left, right)
func Atan2(left, right float64) float64 {
return math.Atan2(left, right)
}
// Default returns left or right if left is NaN.
func Default(left, right float64) float64 {
if math.IsNaN(left) {
return right
}
return left
}
// If returns left if right is not NaN. Otherwise NaN is returned.
func If(left, right float64) float64 {
if math.IsNaN(right) {
return nan
}
return left
}
// Ifnot returns left if right is NaN. Otherwise NaN is returned.
func Ifnot(left, right float64) float64 {
if math.IsNaN(right) {
return left
}
return nan
}
// And return left if left and right is not NaN. Otherwise, NaN is returned.
func And(left, right float64) float64 {
if math.IsNaN(left) || math.IsNaN(right) {
return nan
}
return left
}
// Or return the first non-NaN item. If both left and right are NaN, it returns NaN.
func Or(left, right float64) float64 {
if !math.IsNaN(left) {
return left
}
return right
}
|