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?


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

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

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

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

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.


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.