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

Математические операторы определены для множества типов PostgreSQL. Как работают эти операции с типами, для которых нет стандартных соглашений о математических действиях (например, с типами даты/времени), мы опишем в последующих разделах.

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

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

Оператор

Описание

Пример(ы)

числовой_тип + числовой_типчисловой_тип

Сложение

2 + 35

+ числовой_типчисловой_тип

Унарный плюс (нет операции)

+ 3.53.5

числовой_тип - числовой_типчисловой_тип

Вычитание

2 - 3-1

- числовой_типчисловой_тип

Смена знака

- (-4)4

числовой_тип * числовой_типчисловой_тип

Умножение

2 * 36

числовой_тип / числовой_типчисловой_тип

Деление (при делении целочисленных типов результат округляется в направлении нуля)

5.0 / 22.5000000000000000

5 / 22

(-5) / 2-2

числовой_тип % числовой_типчисловой_тип

Остаток от деления; имеется для типов smallint, integer, bigint и numeric

5 % 41

numeric ^ numericnumeric

double precision ^ double precisiondouble precision

Возведение в степень

2 ^ 38

В отличие от принятого в математике порядка, ^ по умолчанию вычисляется слева направо

2 ^ 3 ^ 3512

2 ^ (3 ^ 3)134217728

|/ double precisiondouble precision

Квадратный корень

|/ 25.05

||/ double precisiondouble precision

Кубический корень

||/ 64.04

@ числовой_типчисловой_тип

Абсолютное значение

@ -5.05.0

целочисленный_тип & целочисленный_типцелочисленный_тип

Битовое И

91 & 1511

целочисленный_тип | целочисленный_типцелочисленный_тип

Битовое ИЛИ

32 | 335

целочисленный_тип # целочисленный_типцелочисленный_тип

Битовое исключающее ИЛИ

17 # 520

~ целочисленный_типцелочисленный_тип

Битовое НЕ

~1-2

целочисленный_тип << integerцелочисленный_тип

Битовый сдвиг влево

1 << 416

целочисленный_тип >> integerцелочисленный_тип

Битовый сдвиг вправо

8 >> 22


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

Таблица 9.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

Логарифм по основанию 10

log(100)2

log10 ( numeric ) → numeric

log10 ( double precision ) → double precision

Логарифм по основанию 10 (то же, что и log)

log10(1000)3

log ( b numeric, x numeric ) → numeric

Логарифм x по основанию b

log(2.0, 64.0)6.0000000000000000

min_scale ( numeric ) → integer

Минимальный масштаб (число цифр в дробной части), необходимый для точного представления заданного значения

min_scale(8.4100)2

mod ( y числовой_тип, x числовой_тип ) → числовой_тип

Остаток от деления y/x; имеется для типов smallint, 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) округляется до 1 по модулю.

round(42.4382, 2)42.44

round(1234.56, -1)1230

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 ( operand numeric, low numeric, high numeric, count integer ) → integer

width_bucket ( operand double precision, low double precision, high double precision, count integer ) → integer

Возвращает номер группы, в которую попадёт operand в гистограмме с числом групп count равного размера, в диапазоне от low до high. Результатом будет 0 или count+1, если операнд лежит вне диапазона.

width_bucket(5.35, 0.024, 10.06, 5)3

width_bucket ( operand anycompatible, thresholds anycompatiblearray ) → integer

Возвращает номер группы, в которую попадёт operand (группы определяются нижними границами, передаваемыми в thresholds). Результатом будет 0, если операнд оказывается левее нижней границы. Аргумент operand и элементы массива могут быть любого типа, для которого определены стандартные операторы сравнения. Массив thresholds должен быть отсортирован по возрастанию, иначе будут получены неожиданные результаты.

width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[])2


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

Таблица 9.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() до этого не вызывалась в текущем сеансе, при первом вызове random() затравка будет получена из платформозависимого источника случайных чисел.

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

Таблица 9.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).

В Таблице 9.8 перечислены все имеющиеся гиперболические операторы.

Таблица 9.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