EXP: примеры (SQL)

Работа с экспонентой в SQL Server через функцию EXP
Раздел: Математические функции, Математические
EXP(float_expression): float

Описание функции EXP в MS SQL

Функция EXP в Microsoft SQL Server предназначена для вычисления экспоненты числа, то есть значения экспоненциальной функции ex, где e — основание натурального логарифма (приблизительно 2.71828182845905), а x — заданное числовое выражение.

Функция применяется в математических и статистических расчетах, финансовом моделировании, анализе временных рядов, а также при работе с непрерывным ростом или затуханием процессов.

Синтаксис:
EXP ( numeric_expression )

Аргументы:
numeric_expression — выражение типа numeric или приближенного числового типа данных (float, real).

Возвращаемое значение:
Тип данных, аналогичный типу аргумента. Функция возвращает e, возведенное в степень, указанную в numeric_expression. Для аргумента NULL результатом будет NULL.

Базовые примеры использования

Пример вычисления экспоненты для целого числа:

SELECT EXP(1) AS ExpResult;
ExpResult
2.71828182845905

Пример с десятичным числом:

SELECT EXP(2.5) AS ExpResult;
ExpResult
12.1824939607035

Использование с нулем и отрицательным значением:

SELECT 
    EXP(0) AS ExpZero,
    EXP(-1) AS ExpNegative;
ExpZero ExpNegative
1       0.367879441171442

Применение к столбцу таблицы:

CREATE TABLE #Sample (Value FLOAT);
INSERT INTO #Sample VALUES (0), (1), (2);
SELECT Value, EXP(Value) AS Exponentiation FROM #Sample;
DROP TABLE #Sample;
Value Exponentiation
0     1
1     2.71828182845905
2     7.38905609893065

Похожие функции в MS SQL

LOG и LOG10 — функции, обратные EXP. LOG вычисляет натуральный логарифм, LOG10 — десятичный. Используются, когда требуется найти показатель степени.

POWER — функция возведения в произвольную степень. Применяется вместо EXP, когда основание степени отличается от e.

SQRT — вычисляет квадратный корень числа. Может быть альтернативой для EXP(0.5 * LOG(value)).

Выбор функции зависит от задачи: EXP используется для экспоненциального роста с основанием e, POWER — для произвольного основания.

Типичные ошибки

Передача нечислового аргумента приводит к ошибке преобразования типов.

SELECT EXP('text');
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to float.

Переполнение при очень большом аргументе.

SELECT EXP(1000.0);
Msg 232, Level 16, State 2, Line 1
Arithmetic overflow error for type float, value = INF.

Потеря точности при работе с типами real и float из-за ограничений представления чисел с плавающей точкой.

DECLARE @r REAL = 20.0;
SELECT EXP(@r) AS ExpReal, EXP(CAST(@r AS FLOAT)) AS ExpFloat;
ExpReal             ExpFloat
485165184.000000    485165195.409790

Изменения в последних версиях

В актуальных версиях Microsoft SQL Server (2012 и новее) функция EXP не претерпела значительных изменений в синтаксисе или основном поведении. Все обновления связаны с общими улучшениями обработки чисел с плавающей точкой и интеграцией со средой выполнения .NET CLR.

В SQL Server 2019 и 2022 были оптимизированы вычисления математических функций в контексте использования с технологиями In-Memory OLTP и улучшена параллельная обработка сложных запросов, включающих EXP.

Расширенные примеры применения

Моделирование непрерывного роста с заданной процентной ставкой (5% годовых) за 3 года:

Пример sql
DECLARE @rate FLOAT = 0.05, @time FLOAT = 3.0;
SELECT EXP(@rate * @time) AS GrowthFactor;
GrowthFactor
1.16183424272828

Вычисление нормального (Гауссова) распределения для x=0, mean=0, sigma=1:

Пример sql
DECLARE @x FLOAT = 0, @mean FLOAT = 0, @sigma FLOAT = 1;
SELECT (1 / (@sigma * SQRT(2 * PI()))) * 
       EXP(-0.5 * POWER((@x - @mean)/@sigma, 2)) AS NormalDist;
NormalDist
0.398942280401433

Использование в табличных вычислениях для преобразования логарифмических данных:

Пример sql
WITH LogData AS (
    SELECT 1 AS id, 0.0 AS log_val UNION ALL
    SELECT 2, 1.09861228866811 UNION ALL
    SELECT 3, 2.30258509299405
)
SELECT id, log_val, EXP(log_val) AS original_value
FROM LogData;
id log_val          original_value
1  0                 1
2  1.09861228866811  3
3  2.30258509299405  10

Создание последовательности экспоненциально растущих значений с использованием рекурсивного CTE:

Пример sql
WITH ExpoSeries AS (
    SELECT 0 AS n, EXP(0) AS val
    UNION ALL
    SELECT n + 1, EXP((n+1)*0.5)
    FROM ExpoSeries
    WHERE n < 5
)
SELECT n, val FROM ExpoSeries;
n val
0 1
1 1.64872127070013
2 2.71828182845905
3 4.48168907033806
4 7.38905609893065
5 12.1824939607035

Решение уравнения с использованием EXP и LOG для нахождения времени удвоения при непрерывном росте:

Пример sql
DECLARE @rate FLOAT = 0.07;
SELECT LOG(2) / @rate AS DoublingTimeYears;
DoublingTimeYears
9.90210257996454

Аналоги в других СУБД и языках

MySQL: Функция EXP имеет идентичный синтаксис и поведение.

SELECT EXP(1); -- 2.718281828459045

Oracle: Также поддерживает функцию EXP в составе SQL и PL/SQL.

SELECT EXP(1) FROM dual; -- 2.718281828459045

PostgreSQL: Функция EXP работает аналогично, возвращает тип double precision.

SELECT EXP(1.0); -- 2.718281828459045

SQLite: Математическая функция EXP доступна при подключенном модуле math.

SELECT EXP(1); -- 2.71828182845905

Python (math): Функция math.exp() вычисляет экспоненту для float.

import math
math.exp(1) # 2.718281828459045

JavaScript (Math): Метод Math.exp() возвращает ex.

Math.exp(1); // 2.718281828459045

MS SQL EXP function comments

En
EXP Returns the exponential value of the specified float expression