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

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



Математические операторы

В этом подразделе перечислены математические операторы, имеющиеся для стандартных числовых типов. Если не указано иное, операторы, показанные как принимающие числовой_тип, имеются для типов smallint, integer, bigint, numeric, real и double precision. Операторы, показанные как принимающие целочисленный_тип, имеются для типов smallint, integer и bigint. За исключением отмеченных случаев, все формы операторов возвращают тот же тип данных, какой имеет их аргумент(ы). Вызовы с неодинаковыми типами аргументов, например, integer + numeric, сводятся к использованию типа, идущего в этих списках последним.

числовой_тип + числовой_тип → числовой_тип

Сложение.

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


Математические функции

В этом подразделе перечислены все имеющиеся математические функции. Многие из этих функций представлены в нескольких формах с различными типами аргументов. Если не указано иное, все формы функций возвращают тот же тип данных, какой имеет их аргумент(ы); случаи с неодинаковыми типами разрешаются тем же способом, какой был описан выше для операторов. Функции, работающие с данными типа double precision, в основном реализованы поверх C-библиотеки системы сервера, поэтому точность и поведение в граничных случаях могут варьировать в зависимости от системы сервера.

abs

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

Абсолютное значение (модуль).

abs(-17.4) → 17.4

cbrt

cbrt ( double precision ) → double precision

Кубический корень.

cbrt(64.0) → 4

ceil

ceil ( numeric ) → numeric
ceil ( double precision ) → double precision

Ближайшее целое число, большее или равное аргументу.

ceil(42.2) → 43
ceil(-42.8) → -42

ceiling

ceiling ( numeric ) → numeric
ceiling ( double precision ) → double precision

Ближайшее целое число, большее или равное аргументу (то же, что и ceil).

ceiling(95.3) → 96

degrees

degrees ( double precision ) → double precision

Преобразует радианы в градусы.

degrees(0.5) → 28.64788975654116

div

div ( ynumeric,x numeric ) → numeric

Целочисленное частное y/x (округляется в сторону нуля).

div(9, 4) → 2

erf

erf ( double precision ) → double precision

Функция ошибок.

erf(1.0) → 0.8427007929497149

erfc

erfc ( double precision ) → double precision

Дополнительная функция ошибок (1 - erf(x), без потери точности для больших входных данных).

erfc(1.0) → 0.15729920705028513

exp

exp ( numeric ) → numeric
exp ( double precision ) → double precision

Экспоненциал (e, возведенное в заданную степень)

exp(1.0) → 2.7182818284590452

factorial

factorial ( bigint ) → numeric

Факториал.

factorial(5) → 120

floor

floor ( numeric ) → numeric
floor ( double precision ) → double precision

Ближайшее целое число, меньшее или равное аргументу.

floor(42.8) → 42

floor(-42.8) → -43

gcd

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

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

gcd(1071, 462) → 21

lcm

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

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

lcm(1071, 462) → 23562

ln

ln ( numeric ) → numeric
ln ( double precision ) → double precision

Натуральный логарифм.

ln(2.0) → 0.6931471805599453

log

log ( numeric ) → numeric
log ( double precision ) → double precision

Десятичный логарифм.

log(100) → 2

log10

log10 ( numeric ) → numeric log10 ( double precision ) → double precision

Десятичный логарифм (то же, что и log).

log10(1000) → 3

log

log ( bnumeric,x numeric ) → numeric

Логарифм x по основанию b.

log(2.0, 64.0) → 6.0000000000

min_scale

min_scale ( numeric ) → integer

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

min_scale(8.4100) → 2

mod

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

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

mod(9, 4) → 1

pi

pi ( ) → double precision

Примерное значение числа π.

pi() → 3.141592653589793

power

power ( anumeric,b numeric ) → numeric
power ( adouble precision,b double precision ) → double precision

a возводится в степень b.

power(9, 3) → 729

radians

radians ( double precision ) → double precision

Преобразует градусы в радианы.

radians(45.0) → 0.7853981633974483

round

round ( numeric ) → numeric
round ( double precision ) → double precision

Округляет до ближайшего целого числа. Для numeric половина (.5) округляется до одного по модулю. Для double precision способ округление половины зависит от платформы, но, как правило, выполняется «округление до ближайшего четного».

round(42.4) → 42

round ( vnumeric,s integer ) → numeric

Округляет v до s десятичных знаков. Половина (.5) округляется до одного по модулю.

round(42.4382, 2) → 42.44

round(1234.56, -1) → 1230

scale

scale ( numeric ) → integer

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

scale(8.4100) → 4

sign

sign ( numeric ) → numeric
sign ( double precision ) → double precision

Знак аргумента (-1, 0 или +1).

sign(-8.4) → -1

sqrt

sqrt ( numeric ) → numeric
sqrt ( double precision ) → double precision

Квадратный корень.

sqrt(2) → 1.4142135623730951

trim_scale

trim_scale ( numeric ) → numeric

Сокращает масштаб значения (количество десятичных цифр в дробной части), убирая конечные нули.

trim_scale(8.4100) → 8.41

trunc

trunc ( numeric ) → numeric
trunc ( double precision ) → double precision

Округляет до целого (в сторону нуля).

trunc(42.8) → 42

trunc(-42.8) → -42

trunc ( vnumeric,s integer ) → numeric

Округляет v до s десятичных знаков.

trunc(42.4382, 2) → 42.43

width_bucket

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


Случайные функции

В этом разделе перечислены функции для генерации случайных чисел.

random

random ( ) → double precision

Возвращает случайное значение в диапазоне 0.0 <= x < 1.0.

random() → 0.897124072839091

random_normal

random_normal ( [ среднее_арифметическоеdouble precision [,стандартное_отклонение double precision ]] ) → double precision

Возвращает случайное значение из нормального распределения с заданными параметрами; Для среднего_арифметического по умолчанию установлено значение 0.0, а для стандартного_отклонения — 1.0.

random_normal(0.0, 1.0) → 0.051285419

setseed

setseed ( double precision ) → void

Задает начальное значение для последующих вызовов random() и random_normal(); аргументом должно быть число от -1.0 до 1.0, включая границы.

setseed(0.12345)

Примечание

Функция random() использует простой линейный конгруэнтный алгоритм. Она работает быстро, но не подходит для криптографических приложений; более безопасная альтернатива имеется в модуле pgcrypto. Если вызывается setseed(), то результаты последующих вызовов random() в текущем сеансе можно повторить путем повторных вызовов setseed() с тем же аргументом. Без предварительного вызова setseed() в том же сеансе первый вызов random() получает затравочное значение из платформозависимого источника случайных чисел. Эти замечания справедливы также и для random_normal().



Тригонометрические функции

В этом подразделе перечислены имеющиеся тригонометрические функции. Все эти функции представлены в двух вариантах: один измеряет углы в радианах, а другой — в градусах.

acos

acos ( double precision ) → double precision

Арккосинус в радианах.

acos(1) → 0

acosd

acosd ( double precision ) → double precision

Арккосинус в градусах.

acosd(0.5) → 60

asin

asin ( double precision ) → double precision

Арксинус в радианах.

asin(1) → 1.5707963267948966

asind

asind ( double precision ) → double precision

Арксинус в градусах.

asind(0.5) → 30

atan

atan ( double precision ) → double precision

Арктангенс в радианах.

atan(1) → 0.7853981633974483

atand

atand ( double precision ) → double precision

Арктангенс в градусах.

atand(1) → 45

atan2

atan2 ( ydouble precision,x double precision ) → double precision

Арктангенс отношения y/x в радианах.

atan2(1, 0) → 1.5707963267948966

atan2d

atan2d ( ydouble precision,x double precision ) → double precision

Арктангенс отношения y/x в градусах.

atan2d(1, 0) → 90

cos

cos ( double precision ) → double precision

Косинус, угол в радианах.

cos(0) → 1

cosd

cosd ( double precision ) → double precision

Косинус, угол в градусах.

cosd(60) → 0.5

cot

cot ( double precision ) → double precision

Котангенс, угол в радианах.

cot(0.5) → 1.830487721712452

cotd

cotd ( double precision ) → double precision

Котангенс, угол в градусах.

cotd(45) → 1

sin

sin ( double precision ) → double precision

Синус, угол в радианах.

sin(1) → 0.8414709848078965

sind

sind ( double precision ) → double precision

Синус, угол в градусах.

sind(30) → 0.5

tan

tan ( double precision ) → double precision

Тангенс, угол в радианах.

tan(1) → 1.5574077246549023

tand

tand ( double precision ) → double precision

Тангенс, угол в градусах.

tand(45) → 1

Примечание
Другой способ работы с углами, измеряемыми в градусах, состоит в использовании функций преобразования единиц измерения radians() и degrees(), описанных ранее. Однако предпочтительнее использовать тригонометрические функции с градусами, поскольку этот способ позволяет избежать ошибки округления в особых случаях, например, при вычислении sind(30).



Гиперболические функции

В этом разделе перечислены имеющиеся гиперболические функции.

sinh

sinh ( double precision ) → double precision

Гиперболический синус.

sinh(1) → 1.1752011936438014

cosh

cosh ( double precision ) → double precision

Гиперболический косинус.

cosh(0) → 1

tanh

tanh ( double precision ) → double precision

Гиперболический тангенс.

tanh(1) → 0.7615941559557649

asinh

asinh ( double precision ) → double precision

Ареасинус.

asinh(1) → 0.881373587019543

acosh

acosh ( double precision ) → double precision

Ареакосинус.

acosh(1) → 0

atanh

atanh ( double precision ) → double precision

Ареатангенс.

atanh(0.5) → 0.5493061443340548