¿Cómo puedo especificar la base para Math.log () en JavaScript?

204

Necesito una logfunción para JavaScript, pero debe ser la base 10. No puedo ver ningún listado para esto, así que supongo que no es posible. ¿Hay algún mago de las matemáticas que sepa una solución para esto?

MetaGuru
fuente
2
Existe un método Math.log10 () desde ECMAScript 2015 para aquellos que vienen aquí más adelante.
Haggra

Respuestas:

329

"Cambio de base" Fórmula / Identidad

El valor numérico para el logaritmo a la base 10 se puede calcular con la siguiente identidad.

Logaritmo para base 10


Como Math.log(x)en JavaScript devuelve el logaritmo natural de x(igual que ln (x) ), para la base 10 puede dividir entre Math.log(10)(igual que ln (10) ):

function log10(val) {
  return Math.log(val) / Math.LN10;
}

Math.LN10es una constante precalculada incorporada para Math.log(10), por lo que esta función es esencialmente idéntica a:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Peter
fuente
10
De hecho, se puede usar cualquier base, no solo e o 2, siempre que ambos logaritmos usen la misma base.
Joey
16
Se agregó una imagen con la fórmula y se vinculó a Wikipedia si no le importa.
Anurag
13
Es un desperdicio calcular Math.log (10) cada vez. Innecesario para precalcular y almacenar, ya que Math ya define esta constante w3schools.com/jsref/jsref_ln10.asp
Michael Kariv
44
Para bases que no sean 10, desplácese hacia abajo hasta la respuesta de CMS . Si desplazarse hacia abajo y leer una respuesta suena como un trabajo duro, el principio básico esreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
44
He notado cierto margen de error potencial aquí, probablemente relacionado con las matemáticas de coma flotante. Acabo de probar la función anterior con un valor de 1000 en el nodo, y obtuve un resultado de 2.9999999999999996. (Aunque otros números que probé, como 10, 100 e incluso 10000, salieron con los valores correctos).
user4815162342
64

Fácil, simplemente cambie la base dividiéndola por el registro (10). Incluso hay una constante para ayudarte

Math.log(num) / Math.LN10;

que es lo mismo que:

Math.log(num) / Math.log(10);
bramp
fuente
52

Simplemente puede dividir el logaritmo de su valor y el logaritmo de la base deseada, también puede anular el Math.logmétodo para aceptar un 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
fuente
15

la respuesta aquí causaría un problema de precisión obvio y no es confiable en algunos 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
fuente
8
Ajuste la precisión con redondeo selectivo: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Entonces puedes hacer

Math.log10(your_number);

NOTA: Inicialmente pensé Math.prototype.log10 = ...hacer esto, pero el usuario CMS señaló que Math no funciona de esta manera, así que edité la .prototypeparte.

artlung
fuente
3
Mathes un objeto, no una función constructora, por lo tanto, no tiene una prototypepropiedad.
CMS
gracias CMS Prueba que uno debe probar las cosas antes de sentirse "inspirado". Regresaré al cuaderno de dibujo.
artlung
3
Simplemente quite la .prototypeparte;)
CMS
9

FF 25+ admite un Math.log10método. Puede usar polyfill:

if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };

MDN enumera los navegadores compatibles .

Navegadores de escritorio

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1

Navegadores móviles

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
fuente
1

Math.log10(x)! 😁

La respuesta principal está bien para una base arbitraria, pero la pregunta está relacionada con la base de registro 10, y Math.log10(x)ha sido estándar en todos los navegadores desde 2015. *

* Excepto IE, si eso es importante para ti por alguna razón.

Haumed Rahmani
fuente
0

Si tiene un número x, entonces use Math.log(x) sería esencialmente lnx.

Para convertirlo a una base que no sea e, puede usar la siguiente función:

function(x){ return Math.log(x)/Math.log(10); }
Kartik Singh
fuente