Мне нужна log
функция для JavaScript, но она должна быть базой 10. Я не вижу для этого никакого списка, поэтому предполагаю, что это невозможно. Есть ли какие-нибудь математические волшебники, которые знают решение этой проблемы?
Как я могу указать базу для Math.log () в JavaScript?
Ответы (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);
}
return Math.log(n) / Math.log(base);
- person user56reinstatemonica8; 22.01.2013
Number.EPSILON
, чтобы избежать ошибок округления. Итак, Math.floor(Math.log(1000) / Math.log(10) + Number.EPSILON) === 3
это true
.
- person Nickofthyme; 06.02.2021
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);
Вы можете просто разделить логарифм своего значения и логарифм желаемой базы, также вы можете переопределить метод Math.log
, чтобы принять необязательный базовый аргумент:
Math.log = (function() {
var log = Math.log;
return function(n, base) {
return log(n)/(base ? log(base) : 1);
};
})();
Math.log(5, 10);
ответ здесь вызовет очевидную проблему с точностью и ненадежен в некоторых случаях использования.
> 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
(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
Math.log10 = function(n) {
return (Math.log(n)) / (Math.log(10));
}
Тогда ты можешь сделать
Math.log10(your_number);
ПРИМЕЧАНИЕ. Сначала я думал сделать Math.prototype.log10 = ...
для этого, но пользователь CMS указал, что Math так не работает, поэтому я вырезал .prototype
часть.
Math
- это объект, а не функция-конструктор, поэтому он не ' t имеют свойство prototype
.
- person Christian C. Salvadó; 11.06.2010
.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
Math.log10(x)
! ????
Верхний ответ подходит для произвольной базы, но вопрос касается базы журнала 10, а Math.log10(x)
был стандартен для всех браузеров с 2015 года. *
* За исключением IE, если это по какой-то причине важно для вас.
Если у вас есть число x, то Math.log(x)
будет по существу lnx.
Чтобы преобразовать его в основание, отличное от e, вы можете использовать следующую функцию:
function(x){ return Math.log(x)/Math.log(10); }
Для базы 10 используйте Math.log10()
.
См. Документы по адресу: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10