Math.expm1() вычисляет e^x - 1.
Проще всего запомнить так: это почти Math.exp(x), но сразу с вычитанием единицы.
Синтаксис
Math.expm1(x)
x - степень, в которую нужно возвести число e, а потом из результата вычесть 1.
Что делает Math.expm1()
Метод вычисляет значение по формуле:
e^x - 1
Примеры:
console.log(Math.expm1(0)); // 0
console.log(Math.expm1(1)); // 1.718281828459045
console.log(Math.expm1(2)); // 6.38905609893065
То есть:
Math.expm1(0)даёт0Math.expm1(1)даётe - 1Math.expm1(2)даётe^2 - 1
Что возвращает Math.expm1()
Math.expm1() возвращает число типа number.
const result = Math.expm1(3);
console.log(result); // 19.085536923187668
console.log(typeof result); // "number"
Почему Math.expm1(0) равно 0
Это видно прямо из формулы.
console.log(Math.expm1(0)); // 0
Потому что:
e^0 = 11 - 1 = 0
Отрицательные значения
Если аргумент отрицательный, результат будет отрицательным, но больше -1.
console.log(Math.expm1(-1)); // -0.6321205588285577
console.log(Math.expm1(-2)); // -0.8646647167633873
Это логично:
Math.exp(-1)даёт число меньше1- если потом вычесть
1, получится отрицательное значение
Для обычных конечных чисел результат Math.expm1(x) не опускается ниже -1.
Большие значения
На больших положительных значениях результат быстро растёт.
console.log(Math.expm1(5)); // 147.4131591025766
console.log(Math.expm1(10)); // 22025.465794806718
На очень больших значениях результат может стать Infinity.
console.log(Math.expm1(1000)); // Infinity
Math.expm1() и Math.exp(x) - 1
На первый взгляд кажется, что это одно и то же.
console.log(Math.expm1(2)); // 6.38905609893065
console.log(Math.exp(2) - 1); // 6.38905609893065
Для обычных значений результат часто совпадает.
Но Math.expm1() особенно полезен на очень маленьких числах, потому что считает точнее.
console.log(Math.exp(1e-16) - 1); // 0
console.log(Math.expm1(1e-16)); // 1e-16
Именно в этом и смысл метода: он нужен не только для короткой записи, но и для более точных вычислений.
Math.expm1() и Math.exp()
Эти методы связаны, но делают не одно и то же.
console.log(Math.exp(1)); // 2.718281828459045
console.log(Math.expm1(1)); // 1.718281828459045
Math.exp(x)вычисляетe^xMath.expm1(x)вычисляетe^x - 1
Если единицу потом всё равно нужно вычитать, Math.expm1() часто лучше подходит по смыслу и по точности.
Без аргумента
Если вызвать Math.expm1() без аргумента, результатом будет NaN.
console.log(Math.expm1()); // NaN
Так происходит потому, что метод попытается обработать undefined как число.
Неявное приведение типов
Math.expm1() сначала пытается привести аргумент к числу.
console.log(Math.expm1("2")); // 6.38905609893065
console.log(Math.expm1(null)); // 0
console.log(Math.expm1(true)); // 1.718281828459045
console.log(Math.expm1(undefined)); // NaN
На практике обычно лучше передавать в метод уже готовое число.
NaN и Infinity
Для специальных значений метод ведёт себя предсказуемо.
console.log(Math.expm1(NaN)); // NaN
console.log(Math.expm1(Infinity)); // Infinity
console.log(Math.expm1(-Infinity)); // -1
Это полезно помнить:
InfinityдаётInfinity-Infinityдаёт-1
Число не меняется
Math.expm1() не изменяет исходное значение. Он только возвращает новый результат.
const value = 2;
const result = Math.expm1(value);
console.log(value); // 2
console.log(result); // 6.38905609893065
Когда это полезно
Math.expm1() удобно использовать, когда:
- нужно вычислить именно
e^x - 1 - важна точность на очень маленьких значениях
- формула уже записана в таком виде
- вы хотите избежать лишней потери точности в вычислениях
Пример:
const x = 1e-16;
console.log(Math.expm1(x)); // 1e-16
Частые ошибки
Думать, что это просто Math.exp(x) без особенностей
console.log(Math.exp(1e-16) - 1); // 0
console.log(Math.expm1(1e-16)); // 1e-16
Главная ценность Math.expm1() именно в точности на маленьких числах.
Путать Math.expm1(x) и Math.exp(x)
console.log(Math.exp(1)); // 2.718281828459045
console.log(Math.expm1(1)); // 1.718281828459045
Один метод возвращает e^x, другой - e^x - 1.
Ожидать, что для отрицательных чисел результат будет меньше -1
console.log(Math.expm1(-1)); // -0.6321205588285577
Для конечных значений результат остаётся больше -1, а при -Infinity становится ровно -1.
Быстрая памятка
Math.expm1(x)вычисляетe^x - 1- метод возвращает
number Math.expm1(0)равно0Math.expm1(x)иMath.exp(x) - 1часто дают похожий результат- на очень маленьких числах
Math.expm1()точнее Math.expm1(-Infinity)равно-1
Коротко
Math.expm1() - это стандартный способ вычислить e в степени x минус 1 в JavaScript. Главное, что стоит запомнить: метод особенно полезен тогда, когда важна точность на очень маленьких значениях, и именно этим он лучше простого Math.exp(x) - 1.