Арифметические функции
Обзор
Арифметические функции работают для любых двух операндов типов UInt8
, UInt16
, UInt32
, UInt64
, Int8
, Int16
, Int32
, Int64
, Float32
или Float64
.
Перед выполнением операции оба операнда приводятся к типу результата. Тип результата определяется следующим образом (если не указано иначе в документации функций ниже):
- Если оба операнда имеют ширину до 32 бит, размер типа результата будет равен размеру следующего более крупного типа, следующего за большим из двух операндов (продвижение размера целого числа). Например,
UInt8 + UInt16 = UInt32
илиFloat32 * Float32 = Float64
. - Если один из операндов имеет 64 или более бит, размер типа результата будет таким же, как и у большего из двух операндов. Например,
UInt32 + UInt128 = UInt128
илиFloat32 * Float64 = Float64
. - Если один из операндов является знаковым, тип результата также будет знаковым, в противном случае он будет беззнаковым. Например,
UInt32 * Int32 = Int64
.
Эти правила обеспечивают, что тип результата будет наименьшим типом, который может представить все возможные результаты. Хотя это создает риск переполнений вблизи границы диапазона значений, это обеспечивает быструю обработку расчетов с использованием максимальной нативной ширины целого числа в 64 бита. Это поведение также гарантирует совместимость со многими другими базами данных, которые предоставляют 64-битные целые числа (BIGINT) в качестве наибольшего типа целого числа.
Пример:
Переполнения происходят так же, как и в C++.
abs
Представлено в: v1.1
Выдает абсолютное значение x
. Не влияет, если x
имеет беззнаковый тип. Если x
имеет знаковый тип, возвращает беззнаковое число.
Синтаксис
Аргументы
x
— Значение, для которого требуется получить абсолютное значение
Возвращаемое значение
Абсолютное значение x
Примеры
Пример использования
byteSwap
Представлено в: v23.10
Меняет порядок байтов целого числа, т.е. изменяет его эндIANность.
Следующий пример можно разобрать следующим образом:
- Преобразовать десятичное целое число в его эквивалентный шестнадцатеричный формат в формате big-endian, т.е. 3351772109 -> C7 C7 FB CD (4 байта)
- Обратить порядок байтов, т.е. C7 C7 FB CD -> CD FB C7 C7
- Преобразовать результат обратно в целое число, предполагая big-endian, т.е. CD FB C7 C7 -> 3455829959 Одно из применений этой функции заключается в реверсировании IPv4:
Синтаксис
Аргументы
x
— Целочисленное значение.(U)Int*
Возвращаемое значение
Возвращает x
с измененными байтами. (U)Int*
Примеры
Пример использования
8 бит
16 бит
32 бита
64 бита
divide
Представлено в: v1.1
Вычисляет частное двух значений a
и b
. Тип результата всегда Float64.
Целочисленное деление обеспечивается функцией intDiv
.
Деление на 0
возвращает inf
, -inf
или nan
.
Синтаксис
Аргументы
x
— Делимое -y
— Делитель
Возвращаемое значение
Частное x и y
Примеры
Деление двух чисел
Деление на ноль
divideDecimal
Представлено в: v22.12
Выполняет деление двух десятичных чисел. Результирующее значение будет типа Decimal256.
Масштаб результата может быть явно указан с помощью аргумента result_scale
(константное целое число в диапазоне [0, 76]
). Если не указано, масштаб результата равен максимальному масштабу заданных аргументов.
Эти функции работают значительно медленнее, чем обычное divide
.
Если вам не нужно контролируемое точное значение и/или нужна быстрая обработка, рассмотрите возможность использования divide.
Синтаксис
Аргументы
x
— Первое значение: Decimal. -y
— Второе значение: Decimal. -result_scale
— Масштаб результата. Тип Int/UInt.
Возвращаемое значение
Результат деления с заданным масштабом. Decimal256
Примеры
Пример 1
Пример 2
divideOrNull
Представлено в: v25.5
То же, что и divide
, но возвращает NULL при делении на ноль.
Синтаксис
Аргументы
x
— Делимое -y
— Делитель
Возвращаемое значение
Частное x и y, или NULL.
Примеры
Деление на ноль
gcd
Представлено в: v1.1
Возвращает наибольший общий делитель двух значений a и b.
Исключение выбрасывается при делении на ноль или при делении минимального отрицательного числа на минус один.
Синтаксис
Аргументы
x
— Первое целое число -y
— Второе целое число
Возвращаемое значение
Наибольший общий делитель x
и y
.
Примеры
Пример использования
ifNotFinite
Представлено в: v20.3
Проверяет, является ли значение с плавающей запятой конечным.
Вы можете получить аналогичный результат, используя тернарный оператор: isFinite(x) ? x : y
.
Синтаксис
Аргументы
Возвращаемое значение
x
, еслиx
конечен.y
, еслиx
бесконечно.
Примеры
Пример использования
intDiv
Представлено в: v1.1
Выполняет целочисленное деление двух значений x
на y
. Другими словами, вычисляет частное, округленное вниз до следующего наименьшего целого.
Результат имеет ту же ширину, что и делимое (первый параметр).
Исключение выбрасывается при делении на ноль, если частное не помещается в диапазон делимого или при делении минимального отрицательного числа на минус один.
Синтаксис
Аргументы
x
— Левый операнд. -y
— Правый операнд.
Возвращаемое значение
Результат целочисленного деления x
и y
Примеры
Целочисленное деление двух чисел с плавающей запятой
Частное не помещается в диапазон делимого
intDivOrNull
Представлено в: v25.5
То же, что и intDiv
, но возвращает NULL при делении на ноль или при делении
минимального отрицательного числа на минус один.
Синтаксис
Аргументы
Возвращаемое значение
Результат целочисленного деления x
и y
, или NULL.
Примеры
Целочисленное деление на ноль
Деление минимального отрицательного числа на минус 1
intDivOrZero
Представлено в: v1.1
То же, что и intDiv
, но возвращает ноль при делении на ноль или при делении
минимального отрицательного числа на минус один.
Синтаксис
Аргументы
Возвращаемое значение
Результат целочисленного деления a и b, или ноль.
Примеры
Целочисленное деление на ноль
Деление минимального отрицательного числа на минус 1
isFinite
Представлено в: v1.1
Возвращает 1
, если аргумент Float32 или Float64 не бесконечен и не является NaN
,
в противном случае эта функция возвращает 0
.
Синтаксис
Аргументы
x
— Число для проверки на конечность.Float*
Возвращаемое значение
1
, если x не бесконечен и не NaN
, в противном случае 0
.
Примеры
Проверка, является ли число конечным
isInfinite
Представлено в: v1.1
Возвращает 1
, если аргумент Float32 или Float64 бесконечен, в противном случае эта функция возвращает 0
.
Обратите внимание, что 0
возвращается для NaN
.
Синтаксис
Аргументы
x
— Число для проверки на бесконечность.Float*
Возвращаемое значение
1
, если x бесконечен, в противном случае 0
(включая для NaN
).
Примеры
Проверка, является ли число бесконечным
isNaN
Представлено в: v1.1
Возвращает 1
, если аргумент Float32 и Float64 является NaN
, в противном случае возвращает 0
.
Синтаксис
Аргументы
x
— Аргумент для оценки на предметNaN
.Float*
Возвращаемое значение
1
, если NaN
, в противном случае 0
Примеры
Пример использования
lcm
Представлено в: v1.1
Возвращает наименьшее общее кратное двух значений x
и y
.
Исключение выбрасывается при делении на ноль или при делении минимального отрицательного числа на минус один.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает наименьшее общее кратное x
и y
. (U)Int*
Примеры
Пример использования
max2
Представлено в: v21.11
Возвращает большее из двух числовых значений x
и y
.
Синтаксис
Аргументы
x
— Первое значение(U)Int8/16/32/64
илиFloat*
илиDecimal
y
— Второе значение(U)Int8/16/32/64
илиFloat*
илиDecimal
Возвращаемое значение
Возвращает большее значение из x
и y
. Float64
Примеры
Пример использования
min2
Представлено в: v21.11
Возвращает меньшее из двух числовых значений x
и y
.
Синтаксис
Аргументы
x
— Первое значение(U)Int8/16/32/64
илиFloat*
илиDecimal
y
— Второе значение(U)Int8/16/32/64
илиFloat*
илиDecimal
Возвращаемое значение
Возвращает меньшее значение из x
и y
. Float64
Примеры
Пример использования
minus
Представлено в: v1.1
Вычисляет разность двух значений a
и b
. Результат всегда знаковый.
Также возможно вычитать целое число из даты или даты с временем.
Дополнительно поддерживается вычитание между датами с временем, что приводит к разнице во времени между ними.
Синтаксис
Аргументы
x
— уменьшаемое. -y
— вычитаемое.
Возвращаемое значение
x минус y
Примеры
Вычитание двух чисел
Вычитание целого числа и даты
modulo
Представлено в: v1.1
Вычисляет остаток от деления двух значений a на b.
Тип результата является целым числом, если оба входных числа являются целыми числами. Если одно из входных чисел является числом с плавающей запятой, тип результата — Float64.
Остаток вычисляется по аналогии с C++. Используется усеченное деление для отрицательных чисел.
Исключение выбрасывается при делении на ноль или при делении минимального отрицательного числа на минус один.
Синтаксис
Аргументы
a
— Делимое -b
— Делитель (модуль)
Возвращаемое значение
Остаток от a % b
Примеры
Пример использования
moduloOrNull
Представлено в: v25.5
Вычисляет остаток при делении a
на b
. Похоже на функцию modulo
, кроме того, что moduloOrNull
будет возвращать NULL
если правый аргумент равен 0.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает остаток от деления x
на y
, или null, когда делитель равен нулю.
Примеры
moduloOrNull при делении на ноль
moduloOrZero
Представлено в: v20.3
Похож на modulo, но возвращает ноль, когда делитель равен нулю, в отличие от исключения с функцией modulo.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает остаток от a % b, или 0
, когда делитель равен 0
.
Примеры
Пример использования
multiply
Представлено в: v1.1
Вычисляет произведение двух значений x
и y
.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает произведение x и y
Примеры
Умножение двух чисел
multiplyDecimal
Представлено в: v22.12
Выполняет умножение двух десятичных чисел. Результирующее значение будет типа Decimal256.
Масштаб результата может быть явно указан с помощью аргумента result_scale
(константное целое число в диапазоне [0, 76]
). Если не указано, масштаб результата равен максимальному масштабу заданных аргументов.
Эти функции работают значительно медленнее, чем обычное multiply
.
Если вам не нужно контролируемое точное значение и/или нужна быстрая обработка, рассмотрите возможность использования multiply
Синтаксис
Аргументы
a
— Первое значение.Decimal
b
— Второе значение.Decimal
result_scale
— Масштаб результата.(U)Int*
Возвращаемое значение
Результат умножения с заданным масштабом. Тип: Decimal256
Примеры
Пример использования
Различие с обычным умножением
Переполнение десятичных чисел
negate
Представлено в: v1.1
Инвертирует аргумент x
. Результат всегда знаковый.
Синтаксис
Аргументы
x
— Значение для инверсии.
Возвращаемое значение
Возвращает -x от x
Примеры
Пример использования
plus
Представлено в: v1.1
Вычисляет сумму двух значений x
и y
. Псевдоним: x + y
(оператор).
Можно сложить целое число и дату или дату с временем. Первое
операция увеличивает количество дней в дате, второй операция
увеличивает количество секунд в дате с временем.
Синтаксис
Аргументы
x
— Левый операнд. -y
— Правый операнд.
Возвращаемое значение
Возвращает сумму x и y
Примеры
Сложение двух чисел
Сложение целого числа и даты
positiveModulo
Представлено в: v22.11
Вычисляет остаток при делении x
на y
. Похоже на функцию
modulo
, за исключением того, что positiveModulo
всегда возвращает неотрицательное число.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает разность между x
и наименьшим целым числом, которое не больше
x
, делящимся на y
.
Примеры
Пример использования
positiveModuloOrNull
Представлено в: v25.5
Вычисляет остаток при делении a
на b
. Похож на функцию positiveModulo
, но positiveModuloOrNull
вернет NULL
если правый аргумент равен 0.
Синтаксис
Аргументы
x
— Делимое.(U)Int*
/Float32/64
. -x
— Делитель (модуль).(U)Int*
/Float32/64
.
Возвращаемое значение
Возвращает разность между x
и наименьшим целым числом, которое не больше
x
, делящимся на y
, null
, когда делитель равен нулю.
Примеры
positiveModuloOrNull