Learn JavaScript

Math.expm1() - метод для вычисления e в степени x минус 1 в JavaScript

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) даёт 0
  • Math.expm1(1) даёт e - 1
  • Math.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 = 1
  • 1 - 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^x
  • Math.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) равно 0
  • Math.expm1(x) и Math.exp(x) - 1 часто дают похожий результат
  • на очень маленьких числах Math.expm1() точнее
  • Math.expm1(-Infinity) равно -1

Коротко

Math.expm1() - это стандартный способ вычислить e в степени x минус 1 в JavaScript. Главное, что стоит запомнить: метод особенно полезен тогда, когда важна точность на очень маленьких значениях, и именно этим он лучше простого Math.exp(x) - 1.