Como posso especificar a base para Math.log () em JavaScript?

204

Eu preciso de uma logfunçã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?

MetaGuru
fonte
2
Existe um método Math.log10 () desde o ECMAScript 2015 para quem vem aqui mais tarde.
Haggra

Respostas:

329

Fórmula / Identidade "Mudança de Base"

O valor numérico do logaritmo para a base 10 pode ser calculado com a seguinte identidade.

Logaritmo para base 10


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);
}
Peter
fonte
10
De fato, qualquer base pode ser usada, não apenas e ou 2, desde que ambos os logaritmos usem a mesma base.
Joey
16
Adicionada uma imagem com a fórmula e vinculada à Wikipedia, se você não se importa.
Anurag
13
É um desperdício calcular Math.log (10) de cada vez. Desnecessário precalculate e armazenar desde Math define esta constante já w3schools.com/jsref/jsref_ln10.asp
Michael Kariv
4
Para bases diferentes de 10, role para baixo até a resposta do CMS . Se a rolagem para baixo e lendo a resposta soa como o trabalho duro, princípio básico éreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
Eu notei algum espaço potencial para erro aqui, provavelmente relacionado à matemática de ponto flutuante. Eu apenas tentei a função acima com um valor de 1000 no nó e obtive um resultado de 2.9999999999999996. (Embora outros números que eu tentei, tais como 10, 100, e até 10000, saiu com valores corretos.)
user4815162342
64

Fácil, basta alterar a base, dividindo pelo log (10). Existe até uma constante para ajudá-lo

Math.log(num) / Math.LN10;

que é o mesmo que:

Math.log(num) / Math.log(10);
borda
fonte
52

Você pode simplesmente dividir o logaritmo do seu valor e o logaritmo da base desejada. Também é possível substituir o Math.logmé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);
CMS
fonte
15

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
Royce Chao
fonte
8
Ajuste a precisão com o arredondamento seletivo: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
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 .prototypepeça.

artlung
fonte
3
Mathé um objeto, não uma função construtora, portanto, não possui uma prototypepropriedade
CMS
obrigado CMS. Prova que se deve testar as coisas antes de se sentir "inspirado". Voltarei ao bloco de desenho.
artlung
3
Basta remover a .prototypepeça;)
CMS
9

FF 25+ suporta um Math.log10mé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
Ivan Black
fonte
1

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.

Rahmani Haumed
fonte
0

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); }
Kartik Singh
fonte