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