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?


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

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

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

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

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ęść.


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.