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


205

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


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);

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);

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часть.


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); }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.