Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

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

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

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

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

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

Битовые операторы работают только с целостными типами данных, тогда как другие и работают и с остальными числовыми типами. Битовые операции также работают с битовыми строками 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.6478897565​412
div(y numeric, x numeric) numericцелочисленный результат y/xdiv(9,4)2
exp(dp или numeric) тип аргументаэкспонентаexp(1.0)2.7182818284​5905
floor(dp или numeric) тип аргументаближайшее целое, меньшее или равное аргументуfloor(-42.8)-43
ln(dp или numeric) тип аргументанатуральный логарифмln(2.0)0.6931471805​59945
log(dp или numeric) тип аргументалогарифм по основанию 10log(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округление к 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).