Как я могу указать базу для Math.log () в JavaScript? - PullRequest
194 голосов
/ 11 июня 2010

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

Ответы [ 9 ]

312 голосов
/ 11 июня 2010

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

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

Logarithm for base 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);
}
64 голосов
/ 11 июня 2010

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

Math.log(num) / Math.LN10;

, которая равна:

Math.log(num) / Math.log(10);
49 голосов
/ 11 июня 2010

Вы можете просто разделить логарифм вашего значения и логарифм желаемой базы, а также переопределить метод 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 голосов
/ 01 июня 2013

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

> 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
12 голосов
/ 23 января 2014
const logBase = (n, base) => Math.log(n) / Math.log(base);

https://en.wikipedia.org/wiki/Logarithm#Change_of_base

12 голосов
/ 11 июня 2010
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

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

Math.log10(your_number);

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

9 голосов
/ 01 августа 2014

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 голосов
/ 03 июня 2019

Math.log10(x)! ?

Верхний ответ подходит для произвольной базы, но вопрос касается базы 10, и Math.log10(x) был стандартом во всех браузерах с 2015 года. *

* За исключением IE, если это важно для вас по какой-то причине.

0 голосов
/ 24 июня 2016

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

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

function(x){ return Math.log(x)/Math.log(10); }
...