Как я могу указать базу для Math.log () в JavaScript?

205

Мне нужна logфункция для JavaScript, но она должна быть базовой 10. Я не вижу никаких списков для этого, поэтому я предполагаю, что это невозможно. Есть ли там математические волшебники, которые знают решение для этого?

MetaGuru
источник
2
Начиная с ECMAScript 2015 существует метод Math.log10 () для тех, кто придет сюда позже.
Хаггра

Ответы:

330

"Смена базы" Формула / Идентичность

Числовое значение для логарифма по основанию 10 может быть вычислено со следующим тождеством.

Логарифм по основанию 10


Поскольку Math.log(x)в JavaScript возвращается натуральный логарифм x(такой же, как ln (x) ), для базы 10 вы можете разделить на Math.log(10)(так же, как ln (10) ):

function log10(val) {
  return Math.log(val) / Math.LN10;
}

Math.LN10является встроенной предварительно вычисленной константой для Math.log(10), так что эта функция по существу идентична:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Питер
источник
10
Фактически может использоваться любая база, а не только e или 2, если оба логарифма используют одну и ту же базу.
Джои
16
Добавлено изображение с формулой и ссылка на Википедию, если вы не возражаете.
Анураг
13
Бесполезно каждый раз вычислять Math.log (10). Нет необходимости в предварительном расчете и хранении, так как Math уже определяет эту константу w3schools.com/jsref/jsref_ln10.asp
Майкл Карив
4
Для оснований, отличных от 10, прокрутите вниз до ответа CMS . Если прокрутка вниз и чтение ответа звучит как тяжелая работа, основной принципreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
Я заметил здесь потенциальную возможность для ошибок, возможно, связанных с математикой с плавающей запятой. Я только что попробовал функцию выше со значением 1000 в узле, и получил результат 2.9999999999999996. (Хотя другие числа, которые я пробовал, например, 10, 100 и даже 10000, оказались с правильными значениями.)
user4815162342
64

Легко, просто измените базу путем деления на бревно (10). Существует даже константа, чтобы помочь вам

Math.log(num) / Math.LN10;

что так же, как:

Math.log(num) / Math.log(10);
bramp
источник
52

Вы можете просто разделить логарифм вашего значения и логарифм желаемой базы, также вы можете переопределить Math.logметод, чтобы принять необязательный базовый аргумент:

Math.log = (function() {
  var log = Math.log;
  return function(n, base) {
    return log(n)/(base ? log(base) : 1);
  };
})();

Math.log(5, 10);
CMS
источник
15

ответ здесь вызовет очевидную проблему точности и не является надежным в некоторых случаях использования

> Math.log(10)/Math.LN10
1

> Math.log(100)/Math.LN10
2

> Math.log(1000)/Math.LN10
2.9999999999999996

> Math.log(10000)/Math.LN10
4
Ройс Чао
источник
8
Отрегулируйте точность с избирательным округлением: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Шейн Дэниел
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Тогда вы можете сделать

Math.log10(your_number);

ПРИМЕЧАНИЕ. Сначала я думал сделать Math.prototype.log10 = ...это, но пользователь CMS указал, что Math не работает таким образом, поэтому я отредактировал эту .prototypeчасть.

artlung
источник
3
Mathявляется объектом, а не функцией конструктора, поэтому у него нет prototypeсвойства.
CMS
спасибо CMS. Доказывает, что нужно проверить вещи, прежде чем почувствовать себя «вдохновленным». Я вернусь к блокноте для рисования.
artlung
3
Просто удалите .prototypeчасть;)
CMS
9

FF 25+ поддерживает Math.log10метод. Вы можете использовать polyfill:

if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };

MDN перечисляет поддерживаемые браузеры .

Настольные браузеры

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1

Мобильные браузеры

Android         Chrome for Android    Firefox Mobile (Gecko)  IE Mobile      Opera Mobile    Safari Mobile
Not supported   Not supported         25.0 (25)               Not supported  Not supported   iOS 8
Иван Блэк
источник
0

Если у вас есть номер х, то используйте Math.log(x) существу будет lnx.

Чтобы преобразовать его в базу, отличную от e, вы можете использовать следующую функцию:

function(x){ return Math.log(x)/Math.log(10); }
Картик Сингх
источник