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?


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

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

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

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

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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.