JavaScript'te Math.log () için tabanı nasıl belirleyebilirim?


204

logJavaScript için bir fonksiyona ihtiyacım var , ancak temel 10 olması gerekiyor. Bunun için herhangi bir liste göremiyorum, bu yüzden mümkün olmadığını varsayıyorum. Bunun için bir çözüm bilen matematik sihirbazları var mı?


2
ECMAScript 2015'ten beri buraya daha sonra gelenler için bir Math.log10 () yöntemi var.
Haggra

Yanıtlar:


329

"Baz Değişimi" Formülü / Kimlik

10 tabanına logaritma için sayısal değer aşağıdaki kimlikle hesaplanabilir.

Baz 10 için logaritma


Yana Math.log(x)JavaScript doğal logaritma döner olarak x(aynı şekilde ln (x) ) Eğer bölün bazın 10, Math.log(10)(aynı şekilde ln (10) ):

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

Math.LN10yerleşik bir önceden hesaplanmış sabittir Math.log(10), bu nedenle bu işlev esasen aşağıdakilerle aynıdır:

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

10
Aslında, her iki logaritma aynı tabanı kullandığı sürece, sadece e veya 2 değil, herhangi bir baz kullanılabilir .
Joey

16
Formül içeren bir resim eklendi ve sakıncası yoksa Wikipedia'ya bağlandı.
Anurag

13
Her seferinde Math.log'u (10) hesaplamak için israf. Matematik zaten bu sabiti tanımlar beri ön hesaplama ve saklamak için gereksiz w3schools.com/jsref/jsref_ln10.asp
Michael Kariv

4
10 dışındaki bazlar için CMS'nin cevabına gidin . Aşağı return Math.log(n) / Math.log(base);
kaydırıp

4
Muhtemelen kayan nokta matematik ile ilgili, burada hata için bazı potansiyel oda fark ettim. Yukarıdaki fonksiyonu sadece düğümde 1000 değeri ile denedim ve 2.9999999999999996 sonucunu aldım. (Her ne kadar 10, 100 ve hatta 10000 gibi denediğim diğer sayılar doğru değerlerle ortaya çıktı.)
user4815162342

64

Kolay, sadece günlüğe (10) bölerek tabanı değiştirin. Sana yardım edecek bir sabit bile var

Math.log(num) / Math.LN10;

ki aynı:

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

52

Değerinizin logaritmasını ve istenen tabanın logaritmasını bölebilirsiniz, ayrıca Math.logisteğe bağlı bir temel argümanını kabul etme yöntemini geçersiz kılabilirsiniz :

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

Math.log(5, 10);

15

bu sorunun cevabı bariz hassasiyet sorununa neden olur ve bazı kullanım durumlarında güvenilir değildir

> 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
Seçici yuvarlama ile hassasiyeti ayarlayın: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel


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

Sonra yapabilirsin

Math.log10(your_number);

NOT: Başlangıçta bunu yapmayı düşündüm Math.prototype.log10 = ..., ancak kullanıcı CMS , Math'ın bu şekilde çalışmadığına dikkat çekti, bu yüzden .prototypeparçayı düzenledim .


3
Mathyapıcı işlevi değil, bir nesnedir, bu nedenle bir prototypeözelliği yoktur.
CMS

teşekkürler CMS. Kişinin "ilham" hissetmeden önce bir şeyleri test etmesi gerektiğini kanıtlar. Çizim defterine geri döneceğim.
Haziran'da artlung

3
Sadece .prototypeparçayı kaldırın ;)
CMS

9

FF 25+ bir Math.log10yöntemi destekler . Çoklu dolguyu kullanabilirsiniz:

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

MDN, desteklenen tarayıcıları listeler .

Masaüstü Tarayıcılar

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

Mobil Tarayıcılar

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

Eğer x numaranız varsa, o zaman kullanımı Math.log(x)lnx olur.

E dışında bir tabana dönüştürmek için aşağıdaki işlevi kullanabilirsiniz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.