Learn JavaScript

Math.log() - метод для вычисления натурального логарифма в JavaScript

Math.log() вычисляет натуральный логарифм числа.

Проще всего запомнить так: Math.log(x) отвечает на вопрос, в какую степень нужно возвести число e, чтобы получить x.

Синтаксис

Math.log(x)

x - число, для которого нужно найти натуральный логарифм.

Что делает Math.log()

Метод возвращает натуральный логарифм, то есть логарифм по основанию e.

console.log(Math.log(1));       // 0
console.log(Math.log(Math.E));  // 1
console.log(Math.log(10));      // 2.302585092994046

Это значит:

  • Math.log(1) даёт 0, потому что e^0 = 1
  • Math.log(Math.E) даёт 1, потому что e^1 = e

Что возвращает Math.log()

Math.log() возвращает число типа number.

const result = Math.log(5);

console.log(result);        // 1.6094379124341003
console.log(typeof result); // "number"

Почему Math.log(1) равно 0

Это один из самых важных базовых случаев.

console.log(Math.log(1)); // 0

Потому что любое основание в степени 0 даёт 1, и число e здесь не исключение.

Числа больше 1 и меньше 1

Если число больше 1, логарифм будет положительным.

console.log(Math.log(2));  // 0.6931471805599453
console.log(Math.log(10)); // 2.302585092994046

Если число находится между 0 и 1, логарифм будет отрицательным.

console.log(Math.log(0.5)); // -0.6931471805599453

Это важный момент: отрицательный результат не означает ошибку.

Что происходит с 0

Для нуля результатом будет -Infinity.

console.log(Math.log(0)); // -Infinity

Это логично: чтобы получить число, которое всё ближе к 0, степень у e должна уходить всё дальше в минус.

Отрицательные числа

Вот здесь важный нюанс.

console.log(Math.log(-1)); // NaN

В обычных числах JavaScript натуральный логарифм отрицательного значения не вычисляется, поэтому результатом будет NaN.

Math.log() и Math.exp()

Эти методы связаны друг с другом как обратные операции.

console.log(Math.log(Math.exp(3))); // 3
console.log(Math.exp(Math.log(5))); // 4.999999999999999

Идея здесь такая:

  • Math.exp(x) делает e^x
  • Math.log(x) делает обратную операцию

Во втором примере может быть не идеально ровное 5 из-за особенностей хранения дробных чисел в JavaScript.

Math.log() и Math.log10()

Math.log() - это не десятичный логарифм.

console.log(Math.log(100));   // 4.605170185988092
console.log(Math.log10(100)); // 2
  • Math.log() работает по основанию e
  • Math.log10() работает по основанию 10

Это одна из самых частых путаниц.

Math.log() и Math.log2()

Есть и отдельный метод для основания 2.

console.log(Math.log(8));   // 2.0794415416798357
console.log(Math.log2(8));  // 3

Если нужен логарифм по основанию 2, обычно лучше сразу использовать Math.log2().

Как получить логарифм по своему основанию

Если нужен логарифм не по e, можно использовать формулу смены основания.

const result = Math.log(value) / Math.log(base);

Например, логарифм по основанию 10:

const result = Math.log(1000) / Math.log(10);

console.log(result); // 3

Но если в JavaScript уже есть специальный метод вроде Math.log10() или Math.log2(), обычно он читается понятнее.

Без аргумента

Если вызвать Math.log() без аргумента, результатом будет NaN.

console.log(Math.log()); // NaN

Так происходит потому, что метод попытается обработать undefined как число.

Неявное приведение типов

Math.log() сначала пытается привести аргумент к числу.

console.log(Math.log("10"));   // 2.302585092994046
console.log(Math.log(true));   // 0
console.log(Math.log(null));   // -Infinity
console.log(Math.log(undefined)); // NaN

На практике обычно лучше передавать в метод уже готовое число.

NaN и Infinity

Для специальных значений метод ведёт себя предсказуемо.

console.log(Math.log(NaN));       // NaN
console.log(Math.log(Infinity));  // Infinity
console.log(Math.log(-Infinity)); // NaN

Это удобно помнить:

  • Infinity даёт Infinity
  • -Infinity даёт NaN

Число не меняется

Math.log() не изменяет исходное значение. Он только возвращает новый результат.

const value = 10;
const result = Math.log(value);

console.log(value);  // 10
console.log(result); // 2.302585092994046

Когда это полезно

Math.log() удобно использовать, когда:

  • нужен натуральный логарифм
  • вы работаете с формулами роста, спада и вероятностей
  • нужно сделать обратную операцию к Math.exp()
  • нужно перевести значение в логарифмическую шкалу

Пример:

const value = Math.exp(2);

console.log(Math.log(value)); // 2

Частые ошибки

Думать, что Math.log() считает логарифм по основанию 10

console.log(Math.log(100));   // 4.605170185988092
console.log(Math.log10(100)); // 2

Math.log() - это натуральный логарифм, а не десятичный.

Ожидать NaN для нуля

console.log(Math.log(0)); // -Infinity

Для нуля метод возвращает именно -Infinity, а не NaN.

Ожидать обычное число для отрицательного аргумента

console.log(Math.log(-5)); // NaN

Для отрицательных значений натуральный логарифм в обычных числах JavaScript не вычисляется.

Быстрая памятка

  • Math.log(x) вычисляет натуральный логарифм
  • метод возвращает number
  • основание здесь равно e
  • Math.log(1) равно 0
  • для чисел между 0 и 1 результат отрицательный
  • Math.log(0) даёт -Infinity
  • для отрицательных чисел результатом будет NaN
  • Math.exp() делает обратную операцию

Коротко

Math.log() - это стандартный способ вычислить натуральный логарифм в JavaScript. Главное, что стоит запомнить: метод работает по основанию e, для 0 возвращает -Infinity, а для отрицательных значений даёт NaN.