9.3. Математические функции и операторы
Математические операторы определены для множества типов Postgres Pro. Как работают эти операции с типами, для которых нет стандартных соглашений о математических действиях (например, с типами даты/времени), мы опишем в последующих разделах.
В Таблице 9.4 перечислены все доступные математические операторы.
Таблица 9.4. Математические операторы
| Оператор | Описание | Пример | Результат | 
|---|
| + | сложение | 2 + 3 | 5 | 
| - | вычитание | 2 - 3 | -1 | 
| * | умножение | 2 * 3 | 6 | 
| / | деление (при целочисленном делении остаток отбрасывается) | 4 / 2 | 2 | 
| % | остаток от деления | 5 % 4 | 1 | 
| ^ | возведение в степень (вычисляется слева направо) | 2.0 ^ 3.0 | 8 | 
| |/ | квадратный корень | |/ 25.0 | 5 | 
| ||/ | кубический корень | ||/ 27.0 | 3 | 
| ! | факториал (устаревший оператор, его заменяет функция factorial()) | 5 ! | 120 | 
| !! | факториал в префиксной форме (устаревший оператор, его заменяет функция factorial()) | !! 5 | 120 | 
| @ | модуль числа (абсолютное значение) | @ -5.0 | 5 | 
| & | битовый AND | 91 & 15 | 11 | 
| | | битовый OR | 32 | 3 | 35 | 
| # | битовый XOR | 17 # 5 | 20 | 
| ~ | битовый NOT | ~1 | -2 | 
| << | битовый сдвиг влево | 1 << 4 | 16 | 
| >> | битовый сдвиг вправо | 8 >> 2 | 2 | 
Битовые операторы работают только с целочисленными типами данных и с битовыми строками bit и bit varying, как показано в Таблице 9.13.
В Таблице 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.6478897565412 | 
| div(ynumeric,xnumeric) | numeric | целочисленный результат y/x | div(9,4) | 2 | 
| exp(dpилиnumeric) | тип аргумента | экспонента | exp(1.0) | 2.71828182845905 | 
| factorial(bigint) | numeric | факториал | factorial(5) | 120 | 
| floor(dpилиnumeric) | тип аргумента | ближайшее целое, меньшее или равное аргументу | floor(-42.8) | -43 | 
| ln(dpилиnumeric) | тип аргумента | натуральный логарифм | ln(2.0) | 0.693147180559945 | 
| log(dpилиnumeric) | тип аргумента | логарифм по основанию 10 | log(100.0) | 2 | 
| log(bnumeric,xnumeric) | numeric | логарифм по основанию b | log(2.0, 64.0) | 6.0000000000 | 
| mod(y,x) | зависит от типов аргументов | остаток от деления y/x | mod(9,4) | 1 | 
| pi() | dp | константа «π» | pi() | 3.14159265358979 | 
| power(adp,bdp) | dp | aвозводится в степеньb | power(9.0, 3.0) | 729 | 
| power(anumeric,bnumeric) | numeric | aвозводится в степеньb | power(9.0, 3.0) | 729 | 
| radians(dp) | dp | преобразование градусов в радианы | radians(45.0) | 0.785398163397448 | 
| round(dpилиnumeric) | тип аргумента | округление до ближайшего целого | round(42.4) | 42 | 
| round(vnumeric,sint) | 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.4142135623731 | 
| trunc(dpилиnumeric) | тип аргумента | округление к нулю | trunc(42.8) | 42 | 
| trunc(vnumeric,sint) | numeric | округление к 0 до sдесятичных знаков | trunc(42.4382, 2) | 42.43 | 
| width_bucket(operanddp,b1dp,b2dp,countint) | int | возвращает номер группы, в которую попадёт operandв гистограмме с числом группcountравного размера, в диапазоне отb1доb2; возвращает0или, если операнд лежит вне диапазонаcount+1 | width_bucket(5.35, 0.024, 10.06, 5) | 3 | 
| width_bucket(operandnumeric,b1numeric,b2numeric,countint) | int | возвращает номер группы, в которую попадёт operandв гистограмме с числом группcountравного размера, в диапазоне отb1доb2; возвращает0или, если операнд лежит вне диапазонаcount+1 | width_bucket(5.35, 0.024, 10.06, 5) | 3 | 
| width_bucket(operandanyelement,thresholdsanyarray) | 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()
Наконец, в Таблице 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).