¿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?


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

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

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

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

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.


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.