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?


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);
}

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);

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);

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

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.


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


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); }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.