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

Математические операторы предоставляются для многих типов 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 и numeric

5 % 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 и numeric

gcd(1071, 462) → 21

lcm ( числовой_тип, числовой_тип ) → числовой_тип

Наименьшее общее кратное (наименьшее строго положительное число, которое делится на оба аргумента без остатка; возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numeric

lcm(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 по основанию b

log(2.0, 64.0) → 6.0000000000

min_scale ( numeric ) → integer

Минимальный масштаб (количество цифр в дробной части), необходимый для точного представления заданного значения

min_scale(8.4100) → 2

mod ( y числовой_тип, x числовой_тип ) → числовой_тип

Остаток от y/x; имеется для типов integer, bigint и numeric

mod(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 возводится в степень b

power(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.0

random() → 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