Come posso specificare la base per Math.log () in JavaScript?


204

Ho bisogno di una logfunzione per JavaScript, ma deve essere base 10. Non riesco a vedere alcun elenco per questo, quindi presumo che non sia possibile. Ci sono maghi matematici là fuori che conoscono una soluzione per questo?


2
Esiste un metodo Math.log10 () sin da ECMAScript 2015 per coloro che verranno qui in seguito.
Haggra,

Risposte:


329

Formula / identità "Cambio di base"

Il valore numerico per il logaritmo in base 10 può essere calcolato con la seguente identità.

Logaritmo per base 10


Dato che Math.log(x)in JavaScript restituisce il logaritmo naturale di x(uguale a ln (x) ), per base 10 è possibile dividere per Math.log(10)(uguale a ln (10) ):

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

Math.LN10è una costante pre-calcolata incorporata per Math.log(10), quindi questa funzione è sostanzialmente identica a:

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

10
In effetti, è possibile utilizzare qualsiasi base, non solo e o 2, purché entrambi i logaritmi utilizzino la stessa base.
Joey,

16
Aggiunta un'immagine con la formula e collegata a Wikipedia se non ti dispiace.
Anurag,

13
Sprecato per calcolare Math.log (10) ogni volta. Non è necessario precalcolare e archiviare poiché Math definisce già questa costante w3schools.com/jsref/jsref_ln10.asp
Michael Kariv,

4
Per basi diverse da 10, scorrere verso il basso fino alla risposta di CMS . Se scorrere verso il basso e leggere una risposta suona come un duro lavoro, il principio di base èreturn Math.log(n) / Math.log(base);
user56reinstatemonica8

4
Ho notato un potenziale margine di errore qui, probabilmente dovuto alla matematica in virgola mobile. Ho appena provato la funzione sopra con un valore di 1000 nel nodo e ho ottenuto un risultato di 2.9999999999999996. (Sebbene altri numeri che ho provato, come 10, 100 e persino 10000, siano usciti con i valori corretti.)
user4815162342

64

Facile, basta cambiare la base dividendo per il registro (10). C'è anche una costante per aiutarti

Math.log(num) / Math.LN10;

che è lo stesso di:

Math.log(num) / Math.log(10);

52

Puoi semplicemente dividere il logaritmo del tuo valore e il logaritmo della base desiderata, inoltre puoi ignorare il Math.logmetodo per accettare un argomento di base opzionale:

Math.log = (function() {
  var log = Math.log;
  return function(n, base) {
    return log(n)/(base ? log(base) : 1);
  };
})();

Math.log(5, 10);

15

la risposta qui causerebbe un evidente problema di precisione e non è affidabile in alcuni casi d'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
Regola la precisione con arrotondamenti selettivi: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel,


13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Quindi puoi farlo

Math.log10(your_number);

NOTA: inizialmente ho pensato di fare Math.prototype.log10 = ...questo, ma l'utente CMS ha sottolineato che la matematica non funziona in questo modo, quindi ho modificato la .prototypeparte.


3
Mathè un oggetto, non una funzione di costruzione, quindi non ha una prototypeproprietà.
CMS,

grazie CMS. Dimostriamo di dover testare le cose prima di sentirsi "ispirati". Tornerò al blocco da disegno.
artlung,

3
Basta rimuovere la .prototypeparte;)
CMS

9

FF 25+ supporta un Math.log10metodo. È possibile utilizzare polyfill:

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

MDN elenca i browser supportati .

Browser desktop

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

Browser mobili

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 si dispone di un numero x, l'utilizzo di Math.log(x)sarebbe essenzialmente lnx.

Per convertirlo in una base diversa da e, è possibile utilizzare la seguente funzione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.