Bagaimana saya bisa menentukan basis untuk Math.log () dalam JavaScript?

204

Saya memerlukan logfungsi untuk JavaScript, tetapi harus berbasis 10. Saya tidak dapat melihat daftar apa pun untuk ini, jadi saya menganggap itu tidak mungkin. Apakah ada penyihir matematika di luar sana yang tahu solusi untuk ini?

MetaGuru
sumber
2
Ada metode Math.log10 () sejak ECMAScript 2015 untuk mereka yang datang ke sini nanti.
Haggra

Jawaban:

329

Formula / Identitas "Perubahan Basis"

Nilai numerik untuk logaritma ke basis 10 dapat dihitung dengan identitas berikut.

Logaritma untuk base 10


Karena Math.log(x)dalam JavaScript mengembalikan logaritma natural dari x(sama dengan ln (x) ), untuk basis 10 Anda dapat membaginya dengan Math.log(10)(sama dengan ln (10) ):

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

Math.LN10adalah konstanta precomputed bawaan untuk Math.log(10), jadi fungsi ini pada dasarnya identik dengan:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Peter
sumber
10
Faktanya, setiap basis dapat digunakan, bukan hanya e atau 2, selama kedua logaritma menggunakan basis yang sama.
Joey
16
Menambahkan gambar dengan rumus dan ditautkan ke Wikipedia jika Anda tidak keberatan.
Anurag
13
Boros menghitung Math.log (10) setiap kali. Tidak perlu menghitung ulang dan menyimpan karena Math mendefinisikan konstanta ini sudah w3schools.com/jsref/jsref_ln10.asp
Michael Kariv
4
Untuk pangkalan selain 10, gulir ke bawah ke jawaban CMS . Jika menggulir ke bawah dan membaca jawaban terdengar seperti kerja keras, prinsip dasarnya adalahreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
Saya telah memperhatikan beberapa ruang potensial untuk kesalahan di sini, mungkin berkaitan dengan matematika floating point. Saya baru saja mencoba fungsi di atas dengan nilai 1000 pada node, dan mendapat hasil 2.9999999999999996. (Meskipun angka lain yang saya coba, seperti 10, 100, dan bahkan 10000, keluar dengan nilai yang benar.)
user4815162342
64

Mudah, cukup ganti basis dengan membaginya dengan log (10). Bahkan ada konstanta untuk membantu Anda

Math.log(num) / Math.LN10;

yang sama dengan:

Math.log(num) / Math.log(10);
bramp
sumber
52

Anda bisa membagi logaritma nilai Anda, dan logaritma basis yang diinginkan, juga Anda bisa mengganti Math.logmetode untuk menerima argumen basis opsional:

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

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

jawabannya di sini akan menyebabkan masalah presisi yang jelas dan tidak dapat diandalkan dalam beberapa kasus penggunaan

> 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
sumber
8
Sesuaikan presisi dengan pembulatan selektif: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Maka Anda bisa melakukannya

Math.log10(your_number);

CATATAN: Awalnya saya berpikir untuk melakukan Math.prototype.log10 = ...ini, tetapi pengguna CMS menunjukkan bahwa Math tidak berfungsi seperti ini, jadi saya mengedit .prototypebagian itu.

artlung
sumber
3
Mathadalah objek, bukan fungsi konstruktor, oleh karena itu tidak memiliki prototypeproperti.
CMS
terima kasih CMS. Membuktikan seseorang harus menguji hal-hal sebelum dia merasa "terinspirasi." Saya akan kembali ke kertas gambar.
artlung
3
Hapus saja .prototypebagian;)
CMS
9

FF 25+ mendukung suatu Math.log10metode. Anda dapat menggunakan polyfill:

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

MDN mencantumkan browser yang didukung .

Browser Desktop

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

Peramban Seluler

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

Math.log10(x)! 😁

Jawaban teratas baik untuk basis arbitrer, tetapi pertanyaannya adalah mengenai basis log 10, dan Math.log10(x)telah menjadi standar di semua browser sejak 2015. *

* Kecuali IE, jika itu penting bagi Anda karena alasan tertentu.

Haumed Rahmani
sumber
0

Jika Anda memiliki angka x, maka penggunaan Math.log(x)dasarnya adalah lnx.

Untuk mengonversinya menjadi basis selain e, Anda dapat menggunakan fungsi berikut:

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