Математические функции и операторы
Математические операторы предоставляются для многих типов QHB. Фактическое поведение с типами без стандартных математических соглашений (например типами даты/времени) мы опишем в последующих разделах.
В Таблице 4 перечислены математические операторы, имеющиеся для стандартных числовых типов. Если не указано иное, операторы, показанные как принимающие числовой_тип, имеются для типов smallint, integer, bigint, numeric, real и double precision. Операторы, показанные как принимающие целочисленный_тип, имеются для типов smallint, integer и bigint. За исключением отмеченных случаев, все формы операторов возвращают тот же тип данных, какой имеет их аргумент (или аргументы). Вызовы с неодинаковыми типами аргументов, например integer + numeric, разрешаются использованием типа, идущего в этих списках последним.
Таблица 4. Математические операторы
Оператор |
||
---|---|---|
Описание Пример(ы) |
||
числовой_тип + числовой_тип → числовой_тип |
||
Сложение
|
||
+ числовой_тип → числовой_тип |
||
Унарный плюс (нет операции)
|
||
числовой_тип - числовой_тип → числовой_тип |
||
Вычитание
|
||
- числовой_тип → числовой_тип |
||
Смена знака
|
||
числовой_тип * числовой_тип → числовой_тип |
||
Умножение
|
||
числовой_тип / числовой_тип → числовой_тип |
||
Деление (при делении целочисленных типов результат округляется в сторону нуля)
|
||
числовой_тип % числовой_тип → числовой_тип |
||
Остаток целочисленного деления (по модулю); имеется для типов smallint, integer, bigint и numeric
|
||
numeric ^ numeric → numeric double precision ^ double precision → double precision |
||
Возведение в степень
В отличие от обычной математической практики,
|
||
|/ double precision → double precision |
||
Квадратный корень
|
||
||/ double precision → double precision |
||
Кубический корень
|
||
@ числовой_тип → числовой_тип |
||
Абсолютное значение (модуль)
|
||
целочисленный_тип & целочисленный_тип → целочисленный_тип |
||
Битовое И
|
||
целочисленный_тип | целочисленный_тип → целочисленный_тип |
||
Битовое ИЛИ
|
||
целочисленный_тип # целочисленный_тип → целочисленный_тип |
||
Битовое исключающее ИЛИ
|
||
~ целочисленный_тип → целочисленный_тип |
||
Битовое НЕ
|
||
целочисленный_тип << integer → целочисленный_тип |
||
Битовый сдвиг влево
|
||
целочисленный_тип >> integer → целочисленный_тип |
||
Битовый сдвиг вправо
|
В Таблице 5 перечислены все имеющиеся математические функции. Многие из этих функций представлены в нескольких формах с различными типами аргументов. За исключением отмеченных случаев, все формы функций возвращают тот же тип данных, какой имеет их аргумент (или аргументы); случаи с неодинаковыми типами разрешаются тем же способом, который был описан выше для операторов. Функции, работающие с данными double precision, в основном реализованы поверх C-библиотеки системы сервера, поэтому точность и поведение в граничных случаях могут варьироваться в зависимости от системы сервера.
Таблица 5. Математические функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
abs ( числовой_тип ) → числовой_тип |
||
Абсолютное значение (модуль)
|
||
cbrt ( double precision ) → double precision |
||
Кубический корень
|
||
ceil ( numeric ) → numeric ceil ( double precision ) → double precision |
||
Ближайшее целое число, большее или равное аргументу
|
||
ceiling ( numeric ) → numeric ceiling ( double precision ) → double precision |
||
Ближайшее целое число, большее или равное аргументу (то же, что и ceil)
|
||
degrees ( double precision ) → double precision |
||
Преобразует радианы в градусы
|
||
div ( y numeric, x numeric ) → numeric |
||
Целочисленное частное y/x (округленное в сторону нуля)
|
||
exp ( numeric ) → numeric exp ( double precision ) → double precision |
||
Экспоненциал (e возводится в заданную степень)
|
||
factorial ( bigint ) → numeric |
||
Факториал
|
||
floor ( numeric ) → numeric floor ( double precision ) → double precision |
||
Ближайшее целое число, меньшее или равное аргументу
|
||
gcd ( числовой_тип, числовой_тип ) → числовой_тип |
||
Наибольший общий делитель (наибольшее положительное число, на которое оба аргумента делятся без остатка); возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numeric
|
||
lcm ( числовой_тип, числовой_тип ) → числовой_тип |
||
Наименьшее общее кратное (наименьшее строго положительное число, которое делится на оба аргумента без остатка; возвращает 0, если оба аргумента равны нулю; имеется для типов integer, bigint и numeric
|
||
ln ( numeric ) → numeric ln ( double precision ) → double precision |
||
Натуральный логарифм
|
||
log ( numeric ) → numeric log ( double precision ) → double precision |
||
Десятичный логарифм
|
||
log10 ( numeric ) → numeric log10 ( double precision ) → double precision |
||
Десятичный логарифм (то же, что и log)
|
||
log ( b numeric, x numeric ) → numeric |
||
Логарифм x по основанию b
|
||
min_scale ( numeric ) → integer |
||
Минимальный масштаб (количество цифр в дробной части), необходимый для точного представления заданного значения
|
||
mod ( y числовой_тип, x числовой_тип ) → числовой_тип |
||
Остаток от y/x; имеется для типов integer, bigint и numeric
|
||
pi ( ) → double precision |
||
Примерное значение π
|
||
power ( a numeric, b numeric ) → numeric power ( a double precision, b double precision ) → double precision |
||
a возводится в степень b
|
||
radians ( double precision ) → double precision |
||
Преобразует градусы в радианы
|
||
round ( numeric ) → numeric round ( double precision ) → double precision |
||
Округляет до ближайшего целого числа. Для numeric половина (.5) округляется до одного по модулю. Для double precision способ округление половины зависит от платформы, но, как правило, выполняется «округление до ближайшего четного».
|
||
round ( v numeric, s integer ) → numeric |
||
Округляет v до s десятичных знаков. Половина (.5) округляется до одного по модулю.
|
||
scale ( numeric ) → integer |
||
Масштаб аргумента (количество десятичных цифр в дробной части)
|
||
sign ( numeric ) → numeric sign ( double precision ) → double precision |
||
Знак аргумента (-1, 0 или +1)
|
||
sqrt ( numeric ) → numeric sqrt ( double precision ) → double precision |
||
Квадратный корень
|
||
trim_scale ( numeric ) → numeric |
||
Сокращает масштаб значения (количество десятичных цифр в дробной части), убирая конечные нули
|
||
trunc ( numeric ) → numeric trunc ( double precision ) → double precision |
||
Округляет до целого (в сторону нуля)
|
||
trunc ( v numeric, s integer ) → numeric |
||
Округляет v до s десятичных знаков
|
||
width_bucket ( операнд numeric, нижняя_граница numeric, верхняя_граница numeric, число integer ) → integer width_bucket ( операнд double precision, нижняя_граница double precision, верхняя_граница double precision, число integer ) → integer |
||
Возвращает номер блока, в который попадает операнд в гистограмме с числом блоков равного размера, расположенных в диапазоне от нижней_границы до верхней_границы. Возвращает 0 или число+1, если операнд лежит вне этого диапазона.
|
||
width_bucket ( операнд anycompatible, пределы anycompatiblearray ) → integer |
||
Возвращает номер блока, в который попадает операнд (при этом нижние границы блоков перечислены в заданном массиве пределов). Возвращает 0, если операнд меньше первой нижней границы. операнд и элементы массива могут быть любого типа, для которого определены стандартные операторы сравнения. Массив пределов должен быть отсортирован по возрастанию, иначе будут получены неожиданные результаты.
|
В Таблице 6 перечислены функции для генерации случайных чисел.
Таблица 6. Случайные функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
random ( ) → double precision |
||
Возвращает случайное значение в диапазоне 0.0 <= x < 1.0
|
||
setseed ( double precision ) → void |
||
Задает начальное значение для последующих вызовов random(); аргументом должно быть число от -1.0 до 1.0, включая границы
|
Функция random() использует простой линейный конгруэнтный алгоритм. Она работает быстро, но не подходит для криптографических приложений; более безопасная альтернатива имеется в модуле pgcrypto. Если вызывается setseed(), то результаты последующих вызовов random() в текущем сеансе можно повторить путем повторных вызовов setseed() с тем же аргументом.
В Таблице 7 перечислены имеющиеся тригонометрические функции. Все эти функции представлены в двух вариантах: один измеряет углы в радианах, а другой — в градусах.
Таблица 7. Тригонометрические функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
acos ( double precision ) → double precision |
||
Арккосинус в радианах
|
||
acosd ( double precision ) → double precision |
||
Арккосинус в градусах
|
||
asin ( double precision ) → double precision |
||
Арксинус в радианах
|
||
asind ( double precision ) → double precision |
||
Арксинус в градусах
|
||
atan ( double precision ) → double precision |
||
Арктангенс в радианах
|
||
atand ( double precision ) → double precision |
||
Арктангенс в градусах
|
||
atan2 ( y double precision, x double precision ) → double precision |
||
Арктангенс отношения y/x в радианах
|
||
atan2d ( y double precision, x double precision ) → double precision |
||
Арктангенс отношения y/x в градусах
|
||
cos ( double precision ) → double precision |
||
Косинус в радианах
|
||
cosd ( double precision ) → double precision |
||
Косинус в градусах
|
||
cot ( double precision ) → double precision |
||
Котангенс в радианах
|
||
cotd ( double precision ) → double precision |
||
Котангенс в градусах
|
||
sin ( double precision ) → double precision |
||
Синус в радианах
|
||
sind ( double precision ) → double precision |
||
Синус в градусах
|
||
tan ( double precision ) → double precision |
||
Тангенс в радианах
|
||
tand ( double precision ) → double precision |
||
Тангенс в градусах
|
Примечание
Другой способ работы с углами, измеряемыми в градусах, состоит в использовании функций преобразования единиц измерения radians() и degrees(), описанных ранее. Однако предпочтительнее использовать тригонометрические функции с градусами, поскольку этот способ позволяет избежать ошибки округления в особых случаях, например, при вычисленииsind(30)
.
В Таблице 8 перечислены имеющиеся гиперболические функции.
Таблица 8. Гиперболические функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
sinh ( double precision ) → double precision |
||
Гиперболический синус
|
||
cosh ( double precision ) → double precision |
||
Гиперболический косинус
|
||
tanh ( double precision ) → double precision |
||
Гиперболический тангенс
|
||
asinh ( double precision ) → double precision |
||
Ареасинус
|
||
acosh ( double precision ) → double precision |
||
Ареакосинус
|
||
atanh ( double precision ) → double precision |
||
Ареатангенс
|