Математические функции и операторы
Математические операторы предоставляются для многих типов QHB. Фактическое поведение с типами без стандартных математических соглашений (например типами даты/времени) мы опишем в последующих разделах.
В Таблице 4 перечислены математические операторы, имеющиеся для стандартных числовых типов. Если не указано иное, операторы, показанные как принимающие числовой_тип, имеются для типов smallint, integer, bigint, numeric, real и double precision. Операторы, показанные как принимающие целочисленный_тип, имеются для типов smallint, integer и bigint. За исключением отмеченных случаев, все формы операторов возвращают тот же тип данных, какой имеет их аргумент (или аргументы). Вызовы с неодинаковыми типами аргументов, например integer + numeric, разрешаются использованием типа, идущего в этих списках последним.
Таблица 4. Математические операторы
Оператор |
||
---|---|---|
Описание Пример(ы) |
||
числовой_тип + числовой_тип → числовой_тип | ||
Сложение2 + 3 → 5 |
||
+ числовой_тип → числовой_тип | ||
Унарный плюс (нет операции)+ 3.5 → 3.5 |
||
числовой_тип - числовой_тип → числовой_тип | ||
Вычитание2 - 3 → -1 |
||
- числовой_тип → числовой_тип | ||
Смена знака- (-4) → 4 |
||
числовой_тип * числовой_тип → числовой_тип | ||
Умножение2 * 3 → 6 |
||
числовой_тип / числовой_тип → числовой_тип | ||
Деление (при делении целочисленных типов результат округляется в сторону нуля)5.0 / 2 → 2.5000000000000000 5 / 2 → 2 (-5) / 2 → -2 |
||
числовой_тип % числовой_тип → числовой_тип | ||
Остаток целочисленного деления (по модулю); имеется для типов smallint, integer, bigint и numeric5 % 4 → 1 |
||
numeric ^ numeric → numeric double precision ^ double precision → double precision |
||
Возведение в степень2 ^ 3 → 8 В отличие от обычной математической практики, ^ по умолчанию вычисляется слева направо:2 ^ 3 ^ 3 → 512 2 ^ (3 ^ 3) → 134217728 |
||
|/ double precision → double precision | ||
Квадратный корень|/ 25.0 → 5 |
||
||/ double precision → double precision | ||
Кубический корень||/ 64.0 → 4 |
||
@ числовой_тип → числовой_тип | ||
Абсолютное значение (модуль)@ -5.0 → 5 |
||
целочисленный_тип & целочисленный_тип → целочисленный_тип | ||
Битовое И91 & 15 → 11 |
||
целочисленный_тип | целочисленный_тип → целочисленный_тип | ||
Битовое ИЛИ32 | 3 → 35 |
||
целочисленный_тип # целочисленный_тип → целочисленный_тип | ||
Битовое исключающее ИЛИ17 # 5 → 20 |
||
~ целочисленный_тип → целочисленный_тип | ||
Битовое НЕ~1 → -2 |
||
целочисленный_тип << integer → целочисленный_тип | ||
Битовый сдвиг влево1 << 4 → 16 |
||
целочисленный_тип >> integer → целочисленный_тип | ||
Битовый сдвиг вправо8 >> 2 → 2 |
В Таблице 5 перечислены все имеющиеся математические функции. Многие из этих функций представлены в нескольких формах с различными типами аргументов. За исключением отмеченных случаев, все формы функций возвращают тот же тип данных, какой имеет их аргумент (или аргументы); случаи с неодинаковыми типами разрешаются тем же способом, который был описан выше для операторов. Функции, работающие с данными double precision, в основном реализованы поверх C-библиотеки системы сервера, поэтому точность и поведение в граничных случаях могут варьироваться в зависимости от системы сервера.
Таблица 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 и numericgcd(1071, 462) → 21 |
||
lcm ( числовой_тип, числовой_тип ) → числовой_тип | ||
Наименьшее общее кратное (наименьшее строго положительное число, которое делится на оба аргумента без остатка; возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numericlcm(1071, 462) → 23562 |
||
ln ( numeric ) → numeric ln ( double precision ) → double precision |
||
Натуральный логарифмln(2.0) → 0.6931471805599453 |
||
log ( numeric ) → numeric log ( double precision ) → double precision |
||
Десятичный логарифмlog(100) → 2 |
||
log10 ( numeric ) → numeric log10 ( double precision ) → double precision |
||
Десятичный логарифм (то же, что и log)log10(1000) → 3 |
||
log ( b numeric, x numeric ) → numeric | ||
Логарифм x по основанию blog(2.0, 64.0) → 6.0000000000 |
||
min_scale ( numeric ) → integer | ||
Минимальный масштаб (количество цифр в дробной части), необходимый для точного представления заданного значенияmin_scale(8.4100) → 2 |
||
mod ( y числовой_тип, x числовой_тип ) → числовой_тип |
||
Остаток от y/x; имеется для типов integer, bigint и numericmod(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 возводится в степень bpower(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) округляется до одного по модулю.round(42.4382, 2) → 42.44 |
||
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 ( операнд numeric, нижняя_граница numeric, верхняя_граница numeric, число integer ) → integer width_bucket ( операнд double precision, нижняя_граница double precision, верхняя_граница double precision, число integer ) → integer |
||
Возвращает номер блока, в который попадает операнд в гистограмме с числом блоков равного размера, расположенных в диапазоне от нижней_границы до верхней_границы. Возвращает 0 или число+1, если операнд лежит вне этого диапазона.width_bucket(5.35, 0.024, 10.06, 5) → 3 |
||
width_bucket ( операнд anycompatible, пределы anycompatiblearray ) → integer | ||
Возвращает номер блока, в который попадает операнд (при этом нижние границы блоков перечислены в заданном массиве пределов). Возвращает 0, если операнд меньше первой нижней границы. операнд и элементы массива могут быть любого типа, для которого определены стандартные операторы сравнения. Массив пределов должен быть отсортирован по возрастанию, иначе будут получены неожиданные результаты.width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]) → 2 |
В Таблице 6 перечислены функции для генерации случайных чисел.
Таблица 6. Случайные функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
random ( ) → double precision | ||
Возвращает случайное значение в диапазоне 0.0 <= x < 1.0random() → 0.897124072839091 |
||
setseed ( double precision ) → void | ||
Задает начальное значение для последующих вызовов random(); аргументом должно быть число от -1.0 до 1.0, включая границыsetseed(0.12345) |
Функция random() использует простой линейный конгруэнтный алгоритм. Она работает быстро, но не подходит для криптографических приложений; более безопасная альтернатива имеется в модуле pgcrypto. Если вызывается setseed(), то результаты последующих вызовов random() в текущем сеансе можно повторить путем повторных вызовов setseed() с тем же аргументом.
В Таблице 7 перечислены имеющиеся тригонометрические функции. Все эти функции представлены в двух вариантах: один измеряет углы в радианах, а другой — в градусах.
Таблица 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)
.
В Таблице 8 перечислены имеющиеся гиперболические функции.
Таблица 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 |