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

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


person Ryan    schedule 10.06.2010    source источник
comment
Начиная с ECMAScript 2015, существует метод Math.log10 () для тех, кто придет сюда позже.   -  person Haggra    schedule 10.12.2019


Ответы (10)


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

Числовое значение логарифма с основанием 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);
}
person Peter    schedule 10.06.2010
comment
Фактически, можно использовать любую основу, а не только e или 2, если оба логарифма используют одну и ту же основу. - person Joey; 11.06.2010
comment
Добавил изображение с формулой и ссылку на Википедию, если вы не против. - person Anurag; 11.06.2010
comment
Бесполезно вычислять Math.log (10) каждый раз. Нет необходимости в предварительном вычислении и хранении, поскольку Math уже определяет эту константу w3schools.com/jsref/jsref_ln10.asp - person Michael Kariv; 27.06.2012
comment
Для баз, отличных от 10, прокрутите вниз до ответа CMS. Если прокрутка вниз и чтение ответа звучит как тяжелая работа, основной принцип - return Math.log(n) / Math.log(base); - person user56reinstatemonica8; 22.01.2013
comment
Я заметил здесь потенциальную возможность ошибки, вероятно, связанной с математикой с плавающей запятой. Я просто попробовал описанную выше функцию со значением 1000 в узле и получил результат 2,99999999999999996. (Хотя другие числа, которые я пробовал, например 10, 100 и даже 10000, дали правильные значения.) - person user4815162342; 13.04.2013
comment
Теперь он присутствует во всех популярных браузерах, кроме IE: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person Vasanth Sriram; 27.10.2014
comment
Может быть полезно добавить к результату Number.EPSILON, чтобы избежать ошибок округления. Итак, Math.floor(Math.log(1000) / Math.log(10) + Number.EPSILON) === 3 это true. - person Nickofthyme; 06.02.2021
comment
Хотя математически правильно, поскольку JS использует стандарт IEEE754 для математики, при арифметике с плавающей запятой возникают ошибки округления. Следовательно, математика базы журналов не будет надежно работать в JS (или любом другом языке, который использует IEEE574 в этом отношении). Math.log(9) / Math.log(3) не будет целым числом. И добавление Number.EPSILON, как предлагалось в предыдущем комментарии, не решает всех случаев. - person Farzad Yousefzadeh; 25.02.2021

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

Math.log(num) / Math.LN10;

что то же самое, что:

Math.log(num) / Math.log(10);
person bramp    schedule 10.06.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);
person Christian C. Salvadó    schedule 10.06.2010

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

> 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
person Royce Chao    schedule 01.06.2013
comment
Отрегулируйте точность с помощью выборочного округления: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6) - person Shane Daniel; 21.11.2013

const logBase = (n, base) => Math.log(n) / Math.log(base);

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

person Yukulélé    schedule 23.01.2014

Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

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

Math.log10(your_number);

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

person artlung    schedule 10.06.2010
comment
Math - это объект, а не функция-конструктор, поэтому он не ' t имеют свойство prototype. - person Christian C. Salvadó; 11.06.2010
comment
спасибо CMS. Доказывает, что нужно проверять вещи, прежде чем почувствовать вдохновение. Я вернусь к блокноту для рисования. - person artlung; 11.06.2010
comment
Просто удалите часть .prototype;) - person Christian C. Salvadó; 11.06.2010

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

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
person Ivan Black    schedule 01.08.2014

Math.log10(x)! ????

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

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

person Haumed Rahmani    schedule 03.06.2019

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

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

function(x){ return Math.log(x)/Math.log(10); }
person Kartik Singh    schedule 24.06.2016

Для базы 10 используйте Math.log10().

См. Документы по адресу: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10

person Lukasz Czerwinski    schedule 19.05.2020