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

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

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

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

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

Таблица 9.4. Математические операторы

Оператор

Описание

Пример(ы)

numeric_type + numeric_typenumeric_type

Дополнение

2 + 35

+ numeric_typenumeric_type

Унарный плюс (без операции)

+ 3.53.5

numeric_type - numeric_typenumeric_type

Вычитание

2 - 3-1

- numeric_typenumeric_type

Отрицание

- (-4)4

numeric_type * numeric_typenumeric_type

Умножение

2 * 36

numeric_type / numeric_typenumeric_type

Деление (для целочисленных типов, деление обрезает результат в сторону нуля)

5.0 / 22.5000000000000000

5 / 22

(-5) / 2-2

numeric_type % numeric_typenumeric_type

Остаток; доступно для smallint, integer, bigint и numeric

5 % 41

numeric ^ numericnumeric

double precision ^ double precisiondouble precision

Возведение в степень

2 ^ 38

В отличие от типичной математической практики, по умолчанию несколько использований ^ будут ассоциироваться слева направо.

2 ^ 3 ^ 3512

2 ^ (3 ^ 3)134217728

|/ double precisiondouble precision

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

|/ 25.05

||/ double precisiondouble precision

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

||/ 64.04

@ numeric_typenumeric_type

Абсолютное значение

@ -5.05.0

integral_type & integral_typeintegral_type

Побитовое И

91 & 1511

integral_type | integral_typeintegral_type

Побитовое ИЛИ

32 | 335

integral_type # integral_typeintegral_type

Побитовое исключающее ИЛИ

17 # 520

~ integral_typeintegral_type

Побитовое НЕ

~1-2

integral_type << integerintegral_type

Побитовый сдвиг влево

1 << 416

integral_type >> integerintegral_type

Побитовый сдвиг вправо

8 >> 22


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

Таблица 9.5. Математические функции

Функция

Описание

Пример(ы)

abs ( numeric_type ) → numeric_type

Абсолютное значение

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

erf ( double precision ) → double precision

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

erf(1.0)0.8427007929497149

erfc ( double precision ) → double precision

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

erfc(1.0)0.15729920705028513

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 ( numeric_type, numeric_type ) → numeric_type

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

gcd(1071, 462)21

lcm ( numeric_type, numeric_type ) → numeric_type

Наименьшее общее кратное (наименьшее строго положительное число, которое является целочисленным кратным обоих входных значений); возвращает 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.0000000000000000

min_scale ( numeric ) → integer

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

min_scale(8.4100)2

mod ( y numeric_type, x numeric_type ) → numeric_type

Оставшийся y/x доступен для smallint, 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

округлить ( double precision ) → double precision

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

round(42.4)42

round ( v numeric, s integer ) → numeric

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

round(42.4382, 2)42.44

round(1234.56, -1)1230

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 ( operand numeric, low numeric, high numeric, count integer ) → integer

width_bucket ( operand double precision, low double precision, high double precision, count integer ) → integer

Возвращает номер корзины, в которое попадает operand в гистограмме, имеющей count равные интервалы ширины в количестве корзин, охватывающих диапазон от low до high. Возвращает 0 или count+1 для входного значения вне этого диапазона.

width_bucket(5.35, 0.024, 10.06, 5)3

width_bucket ( operand anycompatible, thresholds anycompatiblearray ) → integer

Возвращает номер корзины, в которую попадает операнд operand, заданный массивом, содержащим нижние границы корзин. Возвращает 0 для входного значения, меньшего первой нижней границы. Операнд и элементы массива могут быть любого типа, имеющего стандартные операторы сравнения. Массив thresholds должен быть отсортирован по возрастанию, иначе будут получены непредвиденные результаты.

width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[])2


Таблица 9.6 показывает функции для генерации случайных чисел.

Таблица 9.6. Случайные функции

Функция

Описание

Пример(ы)

random ( ) → double precision

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

random()0.897124072839091

random_normal ( [mean double precision [, stddev double precision ]] ) → double precision

Возвращает случайное значение из нормального распределения с заданными параметрами; mean по умолчанию равен 0.0 и stddev по умолчанию равен 1.0

random_normal(0.0, 1.0)0.051285419

setseed ( double precision ) → void

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

setseed(0.12345)


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

Таблица 9.7 показывает доступные тригонометрические функции. Каждая из этих функций имеет две варианта: один измеряет углы в радианах, а другой - в градусах.

Таблица 9.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).

Таблица 9.8 показывает доступные гиперболические функции.

Таблица 9.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