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

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

В Таблице 9.4 перечислены все доступные математические операторы.

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

ОператорОписаниеПримерРезультат
+сложение2 + 35
-вычитание2 - 3-1
*умножение2 * 36
/деление (при целочисленном делении остаток отбрасывается)4 / 22
%остаток от деления5 % 41
^возведение в степень (вычисляется слева направо)2.0 ^ 3.08
|/квадратный корень|/ 25.05
||/кубический корень||/ 27.03
!факториал (устаревший оператор, его заменяет функция factorial())5 !120
!!факториал в префиксной форме (устаревший оператор, его заменяет функция factorial())!! 5120
@модуль числа (абсолютное значение)@ -5.05
&битовый AND91 & 1511
|битовый OR32 | 335
#битовый XOR17 # 520
~битовый NOT~1-2
<<битовый сдвиг влево1 << 416
>>битовый сдвиг вправо8 >> 22

Битовые операторы работают только с целочисленными типами данных и с битовыми строками bit и bit varying, как показано в Таблице 9.14.

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

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

ФункцияТип результатаОписаниеПримерРезультат
abs(x)тип аргументамодуль числа (абсолютное значение)abs(-17.4)17.4
cbrt(dp)dpкубический кореньcbrt(27.0)3
ceil(dp или numeric)тип аргументаближайшее целое, большее или равное аргументуceil(-42.8)-42
ceiling(dp или numeric)тип аргументаближайшее целое, большее или равное аргументу (равнозначно ceil)ceiling(-95.3)-95
degrees(dp)dpпреобразование радианов в градусыdegrees(0.5)28.6478897565​412
div(y numeric, x numeric)numericцелочисленный результат y/xdiv(9,4)2
exp(dp или numeric)тип аргументаэкспонентаexp(1.0)2.7182818284​5905
factorial(bigint)numericфакториалfactorial(5)120
floor(dp или numeric)тип аргументаближайшее целое, меньшее или равное аргументуfloor(-42.8)-43
ln(dp или numeric)тип аргументанатуральный логарифмln(2.0)0.6931471805​59945
log(dp или numeric)тип аргументалогарифм по основанию 10log(100.0)2
log10(dp или numeric)тип аргументалогарифм по основанию 10log10(100.0)2
log(b numeric, x numeric)numericлогарифм по основанию blog(2.0, 64.0)6.0000000000
mod(y, x)зависит от типов аргументовостаток от деления y/xmod(9,4)1
pi()dpконстанта «π»pi()3.1415926535​8979
power(a dp, b dp)dpa возводится в степень bpower(9.0, 3.0)729
power(a numeric, b numeric)numerica возводится в степень bpower(9.0, 3.0)729
radians(dp)dpпреобразование градусов в радианыradians(45.0)0.7853981633​97448
round(dp или numeric)тип аргументаокругление до ближайшего целогоround(42.4)42
round(v numeric, s int)numericокругление v до s десятичных знаковround(42.4382, 2)42.44
scale(numeric)integerмасштаб аргумента (число десятичных цифр в дробной части)scale(8.41)2
sign(dp или numeric)тип аргументазнак аргумента (-1, 0, +1)sign(-8.4)-1
sqrt(dp или numeric)тип аргументаквадратный кореньsqrt(2.0)1.4142135623​731
trunc(dp или numeric)тип аргументаусечение в направлении нуляtrunc(42.8)42
trunc(v numeric, s int)numericусечение до s десятичных знаковtrunc(42.4382, 2)42.43
width_bucket(operand dp, b1 dp, b2 dp, count int)intвозвращает номер группы, в которую попадёт operand в гистограмме с числом групп count равного размера, в диапазоне от b1 до b2; возвращает 0 или count+1, если операнд лежит вне диапазонаwidth_bucket(5.35, 0.024, 10.06, 5)3
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)intвозвращает номер группы, в которую попадёт operand в гистограмме с числом групп count равного размера, в диапазоне от b1 до b2; возвращает 0 или count+1, если операнд лежит вне диапазонаwidth_bucket(5.35, 0.024, 10.06, 5)3
width_bucket(operand anyelement, thresholds anyarray)intвозвращает номер группы, в которую попадёт operand (группы определяются нижними границами, передаваемыми в thresholds); возвращает 0, если операнд оказывается левее нижней границы; массив thresholds должен быть отсортирован по возрастанию, иначе будут получены неожиданные результатыwidth_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[])2

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

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

ФункцияТип результатаОписание
random()dpслучайное число в диапазоне 0.0 <= x < 1.0
setseed(dp)voidзадаёт отправную точку для последующих вызовов random() (значение между -1.0 и 1.0, включая границы)

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

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

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

Функции (в радианах)Функции (в градусах)Описание
acos(x)acosd(x)арккосинус
asin(x) asind(x)арксинус
atan(x) atand(x)арктангенс
atan2(y, x) atan2d(y, x)арктангенс y/x
cos(x) cosd(x)косинус
cot(x) cotd(x)котангенс
sin(x) sind(x)синус
tan(x) tand(x)тангенс

Примечание

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

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

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

ФункцияОписаниеПримерРезультат
sinh(x)гиперболический синусsinh(0)0
cosh(x)гиперболический косинусcosh(0)1
tanh(x)гиперболический тангенсtanh(0)0
asinh(x)обратный гиперболический синусasinh(0)0
acosh(x)обратный гиперболический косинусacosh(1)0
atanh(x)обратный гиперболический тангенсatanh(0)0