Математические функции и операторы

Математические операторы предоставляются для многих типов QHB. Фактическое поведение с типами без стандартных математических соглашений (например типами даты/времени) мы опишем в последующих разделах.

В Таблице 4 перечислены математические операторы, имеющиеся для стандартных числовых типов. Если не указано иное, операторы, показанные как принимающие числовой_тип, имеются для типов smallint, integer, bigint, numeric, real и double precision. Операторы, показанные как принимающие целочисленный_тип, имеются для типов smallint, integer и bigint. За исключением отмеченных случаев, все формы операторов возвращают тот же тип данных, какой имеет их аргумент (или аргументы). Вызовы с неодинаковыми типами аргументов, например integer + numeric, разрешаются использованием типа, идущего в этих списках последним.

Таблица 4. Математические операторы

Оператор
Описание
Пример(ы)
числовой_тип + числовой_типчисловой_тип
Сложение
2 + 3 → 5
+ числовой_типчисловой_тип
Унарный плюс (нет операции)
+ 3.5 → 3.5
числовой_тип - числовой_типчисловой_тип
Вычитание
2 - 3 → -1
- числовой_типчисловой_тип
Смена знака
- (-4) → 4
числовой_тип * числовой_типчисловой_тип
Умножение
2 * 3 → 6
числовой_тип / числовой_типчисловой_тип
Деление (при делении целочисленных типов результат округляется в сторону нуля)
5.0 / 2 → 2.5000000000000000
5 / 2 → 2
(-5) / 2 → -2
числовой_тип % числовой_типчисловой_тип
Остаток целочисленного деления (по модулю); имеется для типов smallint, integer, bigint и numeric
5 % 4 → 1
numeric ^ numeric → numeric
double precision ^ double precision → double precision
Возведение в степень
2 ^ 3 → 8
В отличие от обычной математической практики, ^ по умолчанию вычисляется слева направо:
2 ^ 3 ^ 3 → 512
2 ^ (3 ^ 3) → 134217728
|/ double precision → double precision
Квадратный корень
|/ 25.0 → 5
||/ double precision → double precision
Кубический корень
||/ 64.0 → 4
@ числовой_типчисловой_тип
Абсолютное значение (модуль)
@ -5.0 → 5
целочисленный_тип & целочисленный_типцелочисленный_тип
Битовое И
91 & 15 → 11
целочисленный_тип | целочисленный_типцелочисленный_тип
Битовое ИЛИ
32 | 3 → 35
целочисленный_тип # целочисленный_типцелочисленный_тип
Битовое исключающее ИЛИ
17 # 5 → 20
~ целочисленный_типцелочисленный_тип
Битовое НЕ
~1 → -2
целочисленный_тип << integer → целочисленный_тип
Битовый сдвиг влево
1 << 4 → 16
целочисленный_тип >> integer → целочисленный_тип
Битовый сдвиг вправо
8 >> 2 → 2

В Таблице 5 перечислены все имеющиеся математические функции. Многие из этих функций представлены в нескольких формах с различными типами аргументов. За исключением отмеченных случаев, все формы функций возвращают тот же тип данных, какой имеет их аргумент (или аргументы); случаи с неодинаковыми типами разрешаются тем же способом, который был описан выше для операторов. Функции, работающие с данными double precision, в основном реализованы поверх C-библиотеки системы сервера, поэтому точность и поведение в граничных случаях могут варьироваться в зависимости от системы сервера.

Таблица 5. Математические функции

Функция
Описание
Пример(ы)
abs ( числовой_тип ) → числовой_тип
Абсолютное значение (модуль)
abs(-17.4) → 17.4
cbrt ( double precision ) → double precision
Кубический корень
cbrt(64.0) → 4
ceil ( numeric ) → numeric
ceil ( double precision ) → double precision
Ближайшее целое число, большее или равное аргументу
ceil(42.2) → 43
ceil(-42.8) → -42
ceiling ( numeric ) → numeric
ceiling ( double precision ) → double precision
Ближайшее целое число, большее или равное аргументу (то же, что и ceil)
ceiling(95.3) → 96
degrees ( double precision ) → double precision
Преобразует радианы в градусы
degrees(0.5) → 28.64788975654116
div ( y numeric, x numeric ) → numeric
Целочисленное частное y/x (округленное в сторону нуля)
div(9, 4) → 2
exp ( numeric ) → numeric
exp ( double precision ) → double precision
Экспоненциал (e возводится в заданную степень)
exp(1.0) → 2.7182818284590452
factorial ( bigint ) → numeric
Факториал
factorial(5) → 120
floor ( numeric ) → numeric
floor ( double precision ) → double precision
Ближайшее целое число, меньшее или равное аргументу
floor(42.8) → 42
floor(-42.8) → -43
gcd ( числовой_тип, числовой_тип ) → числовой_тип
Наибольший общий делитель (наибольшее положительное число, на которое оба аргумента делятся без остатка); возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numeric
gcd(1071, 462) → 21
lcm ( числовой_тип, числовой_тип ) → числовой_тип
Наименьшее общее кратное (наименьшее строго положительное число, которое делится на оба аргумента без остатка; возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numeric
lcm(1071, 462) → 23562
ln ( numeric ) → numeric
ln ( double precision ) → double precision
Натуральный логарифм
ln(2.0) → 0.6931471805599453
log ( numeric ) → numeric
log ( double precision ) → double precision
Десятичный логарифм
log(100) → 2
log10 ( numeric ) → numeric
log10 ( double precision ) → double precision
Десятичный логарифм (то же, что и log)
log10(1000) → 3
log ( b numeric, x numeric ) → numeric
Логарифм x по основанию b
log(2.0, 64.0) → 6.0000000000
min_scale ( numeric ) → integer
Минимальный масштаб (количество цифр в дробной части), необходимый для точного представления заданного значения
min_scale(8.4100) → 2
mod ( y числовой_тип, x
числовой_тип ) → числовой_тип
Остаток от y/x; имеется для типов integer, bigint и numeric
mod(9, 4) → 1
pi ( ) → double precision
Примерное значение π
pi() → 3.141592653589793
power ( a numeric, b numeric ) → numeric
power ( a double precision, b double precision ) → double precision
a возводится в степень b
power(9, 3) → 729
radians ( double precision ) → double precision
Преобразует градусы в радианы
radians(45.0) → 0.7853981633974483
round ( numeric ) → numeric
round ( double precision ) → double precision
Округляет до ближайшего целого числа. Для numeric половина (.5) округляется до одного по модулю. Для double precision способ округление половины зависит от платформы, но, как правило, выполняется «округление до ближайшего четного».
round(42.4) → 42
round ( v numeric, s integer ) → numeric
Округляет v до s десятичных знаков. Половина (.5) округляется до одного по модулю.
round(42.4382, 2) → 42.44
scale ( numeric ) → integer
Масштаб аргумента (количество десятичных цифр в дробной части)
scale(8.4100) → 4
sign ( numeric ) → numeric
sign ( double precision ) → double precision
Знак аргумента (-1, 0 или +1)
sign(-8.4) → -1
sqrt ( numeric ) → numeric
sqrt ( double precision ) → double precision
Квадратный корень
sqrt(2) → 1.4142135623730951
trim_scale ( numeric ) → numeric
Сокращает масштаб значения (количество десятичных цифр в дробной части), убирая конечные нули
trim_scale(8.4100) → 8.41
trunc ( numeric ) → numeric
trunc ( double precision ) → double precision
Округляет до целого (в сторону нуля)
trunc(42.8) → 42
trunc(-42.8) → -42
trunc ( v numeric, s integer ) → numeric
Округляет v до s десятичных знаков
trunc(42.4382, 2) → 42.43
width_bucket ( операнд numeric, нижняя_граница numeric, верхняя_граница numeric, число integer ) → integer
width_bucket ( операнд double precision, нижняя_граница double precision, верхняя_граница double precision, число integer ) → integer
Возвращает номер блока, в который попадает операнд в гистограмме с числом блоков равного размера, расположенных в диапазоне от нижней_границы до верхней_границы. Возвращает 0 или число+1, если операнд лежит вне этого диапазона.
width_bucket(5.35, 0.024, 10.06, 5) → 3
width_bucket ( операнд anycompatible, пределы anycompatiblearray ) → integer
Возвращает номер блока, в который попадает операнд (при этом нижние границы блоков перечислены в заданном массиве пределов). Возвращает 0, если операнд меньше первой нижней границы. операнд и элементы массива могут быть любого типа, для которого определены стандартные операторы сравнения. Массив пределов должен быть отсортирован по возрастанию, иначе будут получены неожиданные результаты.
width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]) → 2

В Таблице 6 перечислены функции для генерации случайных чисел.

Таблица 6. Случайные функции

Функция
Описание
Пример(ы)
random ( ) → double precision
Возвращает случайное значение в диапазоне 0.0 <= x < 1.0
random() → 0.897124072839091
setseed ( double precision ) → void
Задает начальное значение для последующих вызовов random(); аргументом должно быть число от -1.0 до 1.0, включая границы
setseed(0.12345)

Функция random() использует простой линейный конгруэнтный алгоритм. Она работает быстро, но не подходит для криптографических приложений; более безопасная альтернатива имеется в модуле pgcrypto. Если вызывается setseed(), то результаты последующих вызовов random() в текущем сеансе можно повторить путем повторных вызовов setseed() с тем же аргументом.

В Таблице 7 перечислены имеющиеся тригонометрические функции. Все эти функции представлены в двух вариантах: один измеряет углы в радианах, а другой — в градусах.

Таблица 7. Тригонометрические функции

Функция
Описание
Пример(ы)
acos ( double precision ) → double precision
Арккосинус в радианах
acos(1) → 0
acosd ( double precision ) → double precision
Арккосинус в градусах
acosd(0.5) → 60
asin ( double precision ) → double precision
Арксинус в радианах
asin(1) → 1.5707963267948966
asind ( double precision ) → double precision
Арксинус в градусах
asind(0.5) → 30
atan ( double precision ) → double precision
Арктангенс в радианах
atan(1) → 0.7853981633974483
atand ( double precision ) → double precision
Арктангенс в градусах
atand(1) → 45
atan2 ( y double precision, x
double precision ) → double precision
Арктангенс отношения y/x в радианах
atan2(1, 0) → 1.5707963267948966
atan2d ( y double precision, x
double precision ) → double precision
Арктангенс отношения y/x в градусах
atan2d(1, 0) → 90
cos ( double precision ) → double precision
Косинус в радианах
cos(0) → 1
cosd ( double precision ) → double precision
Косинус в градусах
cosd(60) → 0.5
cot ( double precision ) → double precision
Котангенс в радианах
cot(0.5) → 1.830487721712452
cotd ( double precision ) → double precision
Котангенс в градусах
cotd(45) → 1
sin ( double precision ) → double precision
Синус в радианах
sin(1) → 0.8414709848078965
sind ( double precision ) → double precision
Синус в градусах
sind(30) → 0.5
tan ( double precision ) → double precision
Тангенс в радианах
tan(1) → 1.5574077246549023
tand ( double precision ) → double precision
Тангенс в градусах
tand(45) → 1

Примечание
Другой способ работы с углами, измеряемыми в градусах, состоит в использовании функций преобразования единиц измерения radians() и degrees(), описанных ранее. Однако предпочтительнее использовать тригонометрические функции с градусами, поскольку этот способ позволяет избежать ошибки округления в особых случаях, например, при вычислении sind(30).

В Таблице 8 перечислены имеющиеся гиперболические функции.

Таблица 8. Гиперболические функции

Функция
Описание
Пример(ы)
sinh ( double precision ) → double precision
Гиперболический синус
sinh(1) → 1.1752011936438014
cosh ( double precision ) → double precision
Гиперболический косинус
cosh(0) → 1
tanh ( double precision ) → double precision
Гиперболический тангенс
tanh(1) → 0.7615941559557649
asinh ( double precision ) → double precision
Ареасинус
asinh(1) → 0.881373587019543
acosh ( double precision ) → double precision
Ареакосинус
acosh(1) → 0
atanh ( double precision ) → double precision
Ареатангенс
atanh(0.5) → 0.5493061443340548