File: funcs.go

package info (click to toggle)
golang-github-victoriametrics-metricsql 0.84.3%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 344 kB
  • sloc: makefile: 2
file content (130 lines) | stat: -rw-r--r-- 2,754 bytes parent folder | download
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
}