9.3. Математические функции и операторы #
Математические операторы определены для множества типов Postgres Pro. Как работают эти операции с типами, для которых нет стандартных соглашений о математических действиях (например, с типами даты/времени), мы опишем в последующих разделах.
В Таблице 9.4 показаны математические операторы, реализованные для стандартных числовых типов. Если не отмечено обратное, операторы, принимающие числовой_тип, работают с типами smallint, integer, bigint, numeric, real и double precision. Операторы, принимающие целочисленный_тип, работают с типами smallint, integer и bigint. За исключением явно отмеченных случаев, все разновидности операторов возвращают такой же тип данных, который имеет их аргумент (или их аргументы). Вызовы с неодинаковыми типами аргументов, например integer + numeric, разрешаются в пользу типа, оказавшегося последним в определённых выше списках.
Таблица 9.4. Математические операторы
Оператор Описание Пример(ы) |
|---|
Сложение
|
Унарный плюс (нет операции)
|
Вычитание
|
Смена знака
|
Умножение
|
Деление (при делении целочисленных типов результат округляется в направлении нуля)
|
Остаток от деления; имеется для типов
|
Возведение в степень
В отличие от принятого в математике порядка,
|
Квадратный корень
|
Кубический корень
|
Абсолютное значение
|
Битовое И
|
Битовое ИЛИ
|
Битовое исключающее ИЛИ
|
Битовое НЕ
|
Битовый сдвиг влево
|
Битовый сдвиг вправо
|
В Таблице 9.5 перечислены все существующие математические функции. Многие из этих функций имеют несколько форм с разными типами аргументов. За исключением случаев, где это указано явно, все разновидности функций возвращают тот же тип данных, который имеет их аргумент (или аргументы); вызовы с неодинаковыми типами разрешаются по тому же принципу, что был описан выше для операторов. Функции, работающие с данными double precision, в массе своей используют реализации из системных библиотек сервера, поэтому точность и поведение в граничных случаях может зависеть от системы сервера.
Таблица 9.5. Математические функции
В Таблице 9.6 перечислены все функции для генерации случайных чисел.
Таблица 9.6. Случайные функции
Функция random() использует детерминированный генератор псевдослучайных чисел. Она работает быстро, но не подходит для криптографических приложений; более безопасная альтернатива имеется в модуле pgcrypto. Если воспользоваться функцией setseed() и вызывать её с одним и тем же аргументом, в текущем сеансе можно получать повторяющиеся последовательности результатов random(). Если функция setseed() до этого не вызывалась в текущем сеансе, при первом вызове random() затравка будет получена из платформозависимого источника случайных чисел. Эти замечания справедливы и для random_normal().
В Таблице 9.7 перечислены все имеющиеся тригонометрические функции. У каждой функции имеются две вариации: одна измеряет углы в радианах, а вторая — в градусах.
Таблица 9.7. Тригонометрические функции
Примечание
Также можно работать с углами в градусах, применяя вышеупомянутые функции преобразования единиц и radians(). Однако предпочтительнее использовать тригонометрические функции с градусами, так как это позволяет избежать ошибок округления в особых случаях, например, при вычислении degrees()sind(30).
В Таблице 9.8 перечислены все имеющиеся гиперболические операторы.
Таблица 9.8. Гиперболические функции