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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
# Math
Набор обёрток вокруг функций из библиотеки libm, а также утилит Яндекс.
## Константы {#constants}
#### Список функций
* `Math::Pi() -> Double`
* `Math::E() -> Double`
* `Math::Eps() -> Double`
#### Примеры
```yql
SELECT Math::Pi(); -- 3.141592654
SELECT Math::E(); -- 2.718281828
SELECT Math::Eps(); -- 2.220446049250313e-16
```
## (Double) -> Bool {#double-bool}
#### Список функций
* `Math::IsInf(Double{Flags:AutoMap}) -> Bool`
* `Math::IsNaN(Double{Flags:AutoMap}) -> Bool`
* `Math::IsFinite(Double{Flags:AutoMap}) -> Bool`
#### Примеры
```yql
SELECT Math::IsNaN(0.0/0.0); -- true
SELECT Math::IsFinite(1.0/0.0); -- false
```
## (Double) -> Double {#double-double}
#### Список функций
* `Math::Abs(Double{Flags:AutoMap}) -> Double`
* `Math::Acos(Double{Flags:AutoMap}) -> Double`
* `Math::Asin(Double{Flags:AutoMap}) -> Double`
* `Math::Asinh(Double{Flags:AutoMap}) -> Double`
* `Math::Atan(Double{Flags:AutoMap}) -> Double`
* `Math::Cbrt(Double{Flags:AutoMap}) -> Double`
* `Math::Ceil(Double{Flags:AutoMap}) -> Double`
* `Math::Cos(Double{Flags:AutoMap}) -> Double`
* `Math::Cosh(Double{Flags:AutoMap}) -> Double`
* `Math::Erf(Double{Flags:AutoMap}) -> Double`
* `Math::ErfInv(Double{Flags:AutoMap}) -> Double`
* `Math::ErfcInv(Double{Flags:AutoMap}) -> Double`
* `Math::Exp(Double{Flags:AutoMap}) -> Double`
* `Math::Exp2(Double{Flags:AutoMap}) -> Double`
* `Math::Fabs(Double{Flags:AutoMap}) -> Double`
* `Math::Floor(Double{Flags:AutoMap}) -> Double`
* `Math::Lgamma(Double{Flags:AutoMap}) -> Double`
* `Math::Rint(Double{Flags:AutoMap}) -> Double`
* `Math::Sigmoid(Double{Flags:AutoMap}) -> Double`
* `Math::Sin(Double{Flags:AutoMap}) -> Double`
* `Math::Sinh(Double{Flags:AutoMap}) -> Double`
* `Math::Sqrt(Double{Flags:AutoMap}) -> Double`
* `Math::Tan(Double{Flags:AutoMap}) -> Double`
* `Math::Tanh(Double{Flags:AutoMap}) -> Double`
* `Math::Tgamma(Double{Flags:AutoMap}) -> Double`
* `Math::Trunc(Double{Flags:AutoMap}) -> Double`
* `Math::Log(Double{Flags:AutoMap}) -> Double`
* `Math::Log2(Double{Flags:AutoMap}) -> Double`
* `Math::Log10(Double{Flags:AutoMap}) -> Double`
#### Примеры
```yql
SELECT Math::Sqrt(256); -- 16
SELECT Math::Trunc(1.2345); -- 1
```
## (Double, Double) -> Double {#doubledouble-double}
#### Список функций
* `Math::Atan2(Double{Flags:AutoMap}, Double{Flags:AutoMap}) -> Double`
* `Math::Fmod(Double{Flags:AutoMap}, Double{Flags:AutoMap}) -> Double`
* `Math::Hypot(Double{Flags:AutoMap}, Double{Flags:AutoMap}) -> Double`
* `Math::Pow(Double{Flags:AutoMap}, Double{Flags:AutoMap}) -> Double`
* `Math::Remainder(Double{Flags:AutoMap}, Double{Flags:AutoMap}) -> Double`
#### Примеры
```yql
SELECT Math::Atan2(1, 0); -- 1.570796327
SELECT Math::Remainder(2.1, 2); -- 0.1
```
## (Double, Int32) -> Double {#doubleint32-double}
#### Список функций
* `Math::Ldexp(Double{Flags:AutoMap}, Int32{Flags:AutoMap}) -> Double`
* `Math::Round(Double{Flags:AutoMap}, [Int32?]) -> Double` - во втором аргументе указывается степень 10, до которой округляем (отрицательная для знаков после запятой и положительная для округления до десятков—тысяч—миллионов); по умолчанию 0
#### Примеры
```yql
SELECT Math::Pow(2, 10); -- 1024
SELECT Math::Round(1.2345, -2); -- 1.23
```
## (Double, Double, \[Double?\]) -> Bool {#doubledouble-bool}
#### Список функций
* `Math::FuzzyEquals(Double{Flags:AutoMap}, Double{Flags:AutoMap}, [Double?]) -> Bool` - сравнивает два Double на нахождение внутри окрестности, задаваемой третьим аргументом; по умолчанию 1.0e-13. Окрестность указывается в относительных единицах от минимального по модулю аргумента.
{% note alert %}
Если один из сравниваемых аргументов равен `0.0`, то функция всегда возвращает `false`.
{% endnote %}
#### Примеры
```yql
SELECT Math::FuzzyEquals(1.01, 1.0, 0.05); -- true
```
## Функции взятия остатка
#### Список функций
* `Math::Mod(Int64{Flags:AutoMap}, Int64) -> Int64?`
* `Math::Rem(Int64{Flags:AutoMap}, Int64) -> Int64?`
Ведут себя аналогично встроенному оператору % в случае неотрицательных аргументов. Различия заметны при отрицательных аргументах:
* Math::Mod сохраняет знак второго аргумента (делителя).
* Math::Rem сохраняет знак первого аргумента (делимого).
Функции возвращают null, если делитель равен нулю.
#### Примеры
```yql
SELECT Math::Mod(-1, 7); -- 6
SELECT Math::Rem(-1, 7); -- -1
```
## Функции округления до целого числа в заданном режиме
#### Список функций
* `Math::RoundDownward() -> Tagged<Uint32, MathRoundingMode>` — округление в сторону отрицательной бесконечности
* `Math::RoundToNearest() -> Tagged<Uint32, MathRoundingMode>` — округление в сторону ближайшего представимого значения
* `Math::RoundTowardZero() -> Tagged<Uint32, MathRoundingMode>` — округление в сторону нуля
* `Math::RoundUpward() -> Tagged<Uint32, MathRoundingMode>` — округление в сторону положительной бесконечности
* `Math::NearbyInt(AutoMap<Double>, Tagged<Uint32, MathRoundingMode>) -> Optional<Int64>` — округление до ближайшего целого значения
Функция `Math::NearbyInt` округляет первый аргумент до целого числа в соответствии с режимом, заданным вторым аргументом.
Если результат выходит за пределы 64-битного целого числа, возвращается NULL.
#### Примеры
```yql
SELECT Math::NearbyInt(1.5, Math::RoundDownward()); -- 1
SELECT Math::NearbyInt(1.5, Math::RoundToNearest()); -- 2
SELECT Math::NearbyInt(2.5, Math::RoundToNearest()); -- 2
SELECT Math::NearbyInt(1.5, Math::RoundTowardZero()); -- 1
SELECT Math::NearbyInt(1.5, Math::RoundUpward()); -- 2
SELECT Math::NearbyInt(-1.5, Math::RoundDownward()); -- -2
SELECT Math::NearbyInt(-1.5, Math::RoundToNearest()); -- -2
SELECT Math::NearbyInt(-2.5, Math::RoundToNearest()); -- -2
SELECT Math::NearbyInt(-1.5, Math::RoundTowardZero()); -- -1
SELECT Math::NearbyInt(-1.5, Math::RoundUpward()); -- -1
```
|