Jak mogę określić podstawę dla Math.log () w JavaScript?

204

Potrzebuję logfunkcji dla JavaScript, ale musi to być baza 10. Nie widzę w tym żadnej listy, więc zakładam, że to niemożliwe. Czy są jacyś czarodzieje matematyki, którzy znają rozwiązanie tego problemu?

MetaGuru
źródło
2
Od czasu ECMAScript 2015 istnieje metoda Math.log10 () dla tych, którzy przybędą tu później.
Haggra,

Odpowiedzi:

329

Formuła / tożsamość „Zmiana podstawy”

Wartość liczbową logarytmu do podstawy 10 można obliczyć z następującą tożsamością.

Logarithm for base 10


Ponieważ Math.log(x)w JavaScript zwraca logarytm naturalny x(taki sam jak ln (x) ), dla podstawy 10 możesz podzielić przez Math.log(10)(taki sam jak ln (10) ):

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

Math.LN10jest wbudowaną wstępnie obliczoną stałą dla Math.log(10), więc ta funkcja jest zasadniczo identyczna z:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Piotr
źródło
10
W rzeczywistości można użyć dowolnej zasady, nie tylko e lub 2, o ile oba logarytmy używają tej samej podstawy.
Joey
16
Dodano zdjęcie z formułą i link do Wikipedii, jeśli nie masz nic przeciwko.
Anurag
13
Niepotrzebne obliczanie Math.log (10) za każdym razem. Nie ma potrzeby wstępnego obliczania
Michael
4
W przypadku baz innych niż 10 przewiń w dół do odpowiedzi CMS . Jeśli przewijanie w dół i czytanie odpowiedzi brzmi jak ciężka praca, podstawową zasadą jestreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
Zauważyłem tutaj potencjalne miejsce na błąd, prawdopodobnie związane z matematyką zmiennoprzecinkową. Właśnie wypróbowałem powyższą funkcję o wartości 1000 w węźle i uzyskałem wynik 2.9999999999999996. (Chociaż inne liczby, które wypróbowałem, takie jak 10, 100, a nawet 10000, wyszły z poprawnymi wartościami.)
user4815162342 13.04.13
64

Łatwo, wystarczy zmienić bazę, dzieląc przez log (10). Jest nawet stała, aby ci pomóc

Math.log(num) / Math.LN10;

który jest taki sam jak:

Math.log(num) / Math.log(10);
bramp
źródło
52

Możesz po prostu podzielić logarytm wartości i logarytm pożądanej podstawy, możesz też przesłonić Math.logmetodę, aby zaakceptować opcjonalny argument bazowy:

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

Math.log(5, 10);
CMS
źródło
15

odpowiedź tutaj spowodowałaby oczywisty problem z precyzją i nie jest wiarygodna w niektórych przypadkach użycia

> 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
źródło
8
Dostosuj precyzję za pomocą selektywnego zaokrąglania: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

To możesz zrobić

Math.log10(your_number);

UWAGA: Początkowo myślałem, aby to Math.prototype.log10 = ...zrobić, ale użytkownik CMS zwrócił uwagę, że matematyka nie działa w ten sposób, więc zredagowałem tę .prototypeczęść.

artlung
źródło
3
Mathjest obiektem, a nie funkcją konstruktora, dlatego nie ma prototypewłaściwości.
CMS
dzięki CMS. Udowadnia, że ​​należy przetestować rzeczy, zanim poczuje się „zainspirowany”. Wrócę do pulpitu rysunkowego.
artlung
3
Wystarczy usunąć .prototypeczęść;)
CMS
9

FF 25+ obsługuje Math.log10metodę. Możesz użyć polyfill:

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

MDN wyświetla listę obsługiwanych przeglądarek .

Przeglądarki stacjonarne

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

Przeglądarki mobilne

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
źródło
1

Math.log10(x)! 😁

Najlepsza odpowiedź jest odpowiednia dla dowolnej bazy danych, ale pytanie dotyczy bazy danych dziennika 10 i Math.log10(x)jest standardem we wszystkich przeglądarkach od 2015 roku. *

* Z wyjątkiem IE, jeśli z jakiegoś powodu jest to dla Ciebie ważne.

Haumed Rahmani
źródło
0

Jeśli masz liczbę x, użyj Math.log(x) będzie w zasadzie lnx.

Aby przekonwertować go na bazę inną niż e, możesz użyć następującej funkcji:

function(x){ return Math.log(x)/Math.log(10); }
Kartik Singh
źródło