Eu preciso de uma log
função para JavaScript, mas ela precisa ser a base 10. Não consigo ver nenhuma listagem para isso, então estou supondo que não seja possível. Existem assistentes de matemática por aí que sabem uma solução para isso?
Eu preciso de uma log
função para JavaScript, mas ela precisa ser a base 10. Não consigo ver nenhuma listagem para isso, então estou supondo que não seja possível. Existem assistentes de matemática por aí que sabem uma solução para isso?
Respostas:
Fórmula / Identidade "Mudança de Base"
O valor numérico do logaritmo para a base 10 pode ser calculado com a seguinte identidade.
Como Math.log(x)
no JavaScript retorna o logaritmo natural de x
(o mesmo que ln (x) ), para a base 10, você pode dividir por Math.log(10)
(o mesmo que ln (10) ):
function log10(val) {
return Math.log(val) / Math.LN10;
}
Math.LN10
é uma constante pré-computada interna para Math.log(10)
, portanto, essa função é essencialmente idêntica a:
function log10(val) {
return Math.log(val) / Math.log(10);
}
return Math.log(n) / Math.log(base);
Você pode simplesmente dividir o logaritmo do seu valor e o logaritmo da base desejada. Também é possível substituir o Math.log
método para aceitar um argumento base opcional:
Math.log = (function() {
var log = Math.log;
return function(n, base) {
return log(n)/(base ? log(base) : 1);
};
})();
Math.log(5, 10);
a resposta aqui causaria um problema óbvio de precisão e não é confiável em alguns casos de uso
> 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)
const logBase = (n, base) => Math.log(n) / Math.log(base);
Math.log10 = function(n) {
return (Math.log(n)) / (Math.log(10));
}
Então você pode fazer
Math.log10(your_number);
NOTA: Inicialmente, pensei em fazer Math.prototype.log10 = ...
isso, mas o usuário CMS apontou que o Math não funciona dessa maneira, então editei a .prototype
peça.
.prototype
peça;)
FF 25+ suporta um Math.log10
método. Você pode usar o polyfill:
if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };
O MDN lista os navegadores suportados .
Navegadores de desktop
Chrome Firefox (Gecko) Internet Explorer Opera Safari 38 25 (25) Not supported 25 7.1
Navegadores móveis
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)
! 😁
A resposta principal é boa para uma base arbitrária, mas a pergunta é sobre a base de log 10 e Math.log10(x)
é padrão em todos os navegadores desde 2015. *
* Exceto IE, se isso for importante para você por algum motivo.
Se você tiver um número x, o uso de Math.log(x)
seria essencialmente lnx.
Para convertê-lo em uma base diferente de e, você pode usar a seguinte função:
function(x){ return Math.log(x)/Math.log(10); }
Para uso na base 10 Math.log10()
.
Consulte os documentos em: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10