Wie kann ich die Basis für Math.log () in JavaScript angeben?

204

Ich benötige eine logFunktion für JavaScript, aber es muss Basis 10 sein. Ich kann keine Auflistung dafür sehen, daher gehe ich davon aus, dass dies nicht möglich ist. Gibt es da draußen Mathe-Assistenten, die eine Lösung dafür kennen?

MetaGuru
quelle
2
Seit ECMAScript 2015 gibt es eine Math.log10 () -Methode für diejenigen, die später hierher kommen.
Haggra

Antworten:

329

Formel / Identität "Basiswechsel"

Der numerische Wert für den Logarithmus zur Basis 10 kann mit der folgenden Identität berechnet werden.

Logarithmus für Basis 10


Da Math.log(x)in JavaScript der natürliche Logarithmus von x(wie in ln (x) ) zurückgegeben wird, können Sie für Basis 10 durch Math.log(10)(wie in ln (10) ) dividieren :

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

Math.LN10ist eine eingebaute vorberechnete Konstante für Math.log(10), daher ist diese Funktion im Wesentlichen identisch mit:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Peter
quelle
10
Tatsächlich kann jede Basis verwendet werden, nicht nur e oder 2, solange beide Logarithmen dieselbe Basis verwenden.
Joey
16
Es wurde ein Bild mit der Formel hinzugefügt und mit Wikipedia verknüpft, wenn Sie nichts dagegen haben.
Anurag
13
Es ist verschwenderisch, jedes Mal Math.log (10) zu berechnen. Unnötig zu berechnen und zu speichern, da Math diese Konstante bereits definiert. W3schools.com/jsref/jsref_ln10.asp
Michael Kariv
4
Scrollen Sie für andere Basen als 10 nach unten zur Antwort von CMS . Wenn das Scrollen nach unten und das Lesen einer Antwort nach harter Arbeit klingt, lautet das Grundprinzipreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
Ich habe hier einen möglichen Fehlerbereich festgestellt, der wahrscheinlich mit Gleitkomma-Mathematik zu tun hat. Ich habe gerade die obige Funktion mit einem Wert von 1000 im Knoten ausprobiert und ein Ergebnis von 2,9999999999999996 erhalten. (Obwohl andere Zahlen, die ich ausprobiert habe, wie 10, 100 und sogar 10000, mit korrekten Werten
herauskamen
64

Einfach, ändern Sie einfach die Basis, indem Sie durch das Protokoll (10) teilen. Es gibt sogar eine Konstante, die Ihnen hilft

Math.log(num) / Math.LN10;

Das ist das gleiche wie:

Math.log(num) / Math.log(10);
Bramp
quelle
52

Sie können einfach den Logarithmus Ihres Werts und den Logarithmus der gewünschten Basis teilen. Außerdem können Sie die Math.logMethode überschreiben , um ein optionales Basisargument zu akzeptieren:

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

Math.log(5, 10);
CMS
quelle
15

Die Antwort hier würde ein offensichtliches Präzisionsproblem verursachen und ist in einigen Anwendungsfällen nicht zuverlässig

> 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
quelle
8
Passen Sie die Präzision mit selektiver Rundung an: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Dann können Sie tun

Math.log10(your_number);

HINWEIS: Anfangs dachte ich, dies Math.prototype.log10 = ...zu tun, aber Benutzer CMS wies darauf hin, dass Math nicht auf diese Weise funktioniert, und habe das .prototypeTeil herausgeschnitten.

artlung
quelle
3
Mathist ein Objekt, keine Konstruktorfunktion, daher hat es keine prototypeEigenschaft.
CMS
danke CMS. Beweist, dass man Dinge testen sollte, bevor man sich "inspiriert" fühlt. Ich gehe zurück zum Zeichenblock.
Artlung
3
Entfernen Sie einfach das .prototypeTeil;)
CMS
9

FF 25+ unterstützt eine Math.log10Methode. Sie können Polyfill verwenden:

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

MDN listet die unterstützten Browser auf .

Desktop-Browser

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

Mobile Browser

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

Math.log10(x)! 😁

Die beste Antwort ist für eine beliebige Basis in Ordnung, aber die Frage bezieht sich auf die Protokollbasis 10 und Math.log10(x)ist seit 2015 in allen Browsern Standard. *

* Außer IE, wenn Ihnen das aus irgendeinem Grund wichtig ist.

Haumed Rahmani
quelle
0

Wenn Sie eine Zahl x haben, Math.log(x)wäre die Verwendung von im Wesentlichen lnx.

Um es in eine andere Basis als e zu konvertieren, können Sie die folgende Funktion verwenden:

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