9.3. Математические функции и операторы
Математические операторы определены для множества типов PostgreSQL. Как работают эти операции с типами, для которых нет стандартных соглашений о математических действиях (например, с типами даты/времени), мы опишем в последующих разделах.
В Таблице 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(y numeric , x numeric )
| 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(b numeric , x numeric )
| numeric | логарифм по основанию b | log(2.0, 64.0) | 6.0000000000 |
mod(y , x )
| зависит от типов аргументов | остаток от деления y /x | mod(9,4) | 1 |
pi()
| dp | константа «π» | pi() | 3.14159265358979 |
power(a dp , b dp )
| dp | a возводится в степень b | power(9.0, 3.0) | 729 |
power(a numeric , b numeric )
| 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(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.4142135623731 |
trunc(dp или numeric )
| тип аргумента | округление к нулю | trunc(42.8) | 42 |
trunc(v numeric , s int )
| numeric | округление к 0 до 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.
Наконец, в Таблице 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)
.