Referensi
Pra-Pembahasan
Artikel ini akan membahas implementasi teknis tentang algoritma menghitung logaritma. Dimulai dari logaritma basis 2 (binary logarithm) sampai ke basis yang lain. Artikel ini mengasumsikan pembaca sudah memahami sifat-sifat dasar logaritma seperti :
Logaritma dalam basis 2 secara matematis dinyatakan sebagai atau ada pula yang menuliskan
Pembahasan
Setiap bilangan real positif selalu dapat ditulis dalam basis 2 (biner), maka berlaku
dimana
.
Perhatikan bahwa persamaan hanya terjadi jika dan hanya jika
adalah bilangan kelipatan 2 (power of two).
Sebagai contoh :
Secara sekilas dapat kita lihat bahwa tidak selalu berupa bilangan bulat. Nilai
hanya akan bulat, yaitu
, jika dan hanya jika
adalah bilangan kelipatan 2 (power of two). Hal ini senada dengan paragraf sebelumnya.
Namun, untuk yang tidak bulat, maka nilainya pasti berada di rentang
dan
.
Atau secara matematis
Contoh lagi :
Sekarang, melalui aljabar sederhana, kita bisa memperoleh :
Di dalam bagian terakhir pertidaksamaan kita peroleh dimana
Dari bentuk , pembaca seharusnya dapat memaklumi bahwa
adalah bagian bulat (integer part) dari
sedangkan
adalah bagian tidak bulat (fractional part). Seperti sudah dijelaskan di beberapa paragraf sebelum ini.
Untuk menghitung bagian yang bulat dapat dilakukan dengan mudah. Yaitu cukup dengan mengalikan/membagi dengan 2 secara terus menerus sampai diperoleh
.
Mengingat nilai adalah 0 dan nilai dari
adalah 1, maka nilai dari
sekarang pasti berupa
Nilai inilah yang dimaksud dengan “bagian tidak bulat”.
Lantas, bagaimana menghitung bagian yang tidak bulat-nya?
Untuk menghitung bagian yang tidak bulat akan kita lakukan trik “mengkuadratkan terus menerus”.
Karena , kuadratkan bagian tengah menjadi
Karena , kuadratkan bagian tengah menjadi
Karena , kuadratkan bagian tengah menjadi
…
Berhenti ketika .
Triknya cukup mudah dimengerti. Yaitu kuadratkan terus sampai bagian tengah lebih besar atau sama dengan 2.
Intermezzo
Mengapa trik ini dapat dipakai?
Suatu bilangan jika dikuadratkan berkali-kali pasti akan “berkembang” sehingga pada akhirnya menembus angka 2. Kita tidak tahu berapa kali “pengkuadratan” yang diperlukan. Yang pasti, cepat atau lambat pasti bilangan tersebut akan menembus angka 2.
Sebagai contoh angka 1.001 baru akan menembus 2 pada saat dipangkatkan dengan 694, yakni .
Di lain pihak, angka 1.2 sudah menempus angka 2 saat dipangkatkan dengan 4, yakni .
Mungkinkah bilangan tersebut – ketika menembus angka 2 – juga menembus angka 4?
Ketika menembus angka 2 yang pertama kalinya, bilangan tersebut tidak akan menembus angka 4 karena :
Saatnya kembali ke pembahasan algoritma logaritma.
Sekarang, jika kita misalkan , tentu saja berlaku
. Dengan membagi ketiga bagian pertidaksamaan dengan 2 kita peroleh
Karena dan
, maka :
Kita peroleh . Ingat bahwa sebelumya kita telah mengetahui bahwa
, sehingga trik yang sama dapat kita lakukan :
Dengan meng-kuadratkan secukupnya, kita peroleh
Misalkan , maka
atau
Dengan men-substitusikan , kita peroleh :
Dengan teknik yang sama, kita peroleh .
Lalu di-substitusikan menjadi :
Dan seterusnya…
Sehingga bentuk umum-nya dapat dituliskan sebagai :
atau ekivalen dengan :
atau jika ditulis ke dalam bentuk yang lebih seragam :
Sampai disini kita telah dapat menghitung bagian tidak bulat (fractional part) dari .
Dengan menggabungkan bagian bulatnya kita peroleh
Dimana :
adalah sembarang bilangan real positif,
dan
adalah bagian bulat dari
adalah bagian tidak bulat dari
Galat dari algoritma ini sangat kecil. Yaitu kurang dari
Untuk mencari logaritma dalam basis lain dapat menggunakan invarian
Pseudo-Code Algoritma :
- Asumsikan bahwa kondisi
terpenuhi
- Tentukan batas toleransi kesalahan,
, secukupnya.
- Bagian bulat :
- Ambil
- Periksa salah satu rentang nilai yang memenuhi
:
- Jika
memenuhi
: lanjut ke langkah 3.3
- Jika
memenuhi
: lompat ke langkah 4
- Jika
memenuhi
: lanjut ke langkah 3.4
- Jika
- Lakukan :
- Kali
dengan 2
- Kurangi
dengan 1
- Periksa apakah kondisi
masih terpenuhi.
- Jika masih terpenuhi, kembali ke langkah 3.3
- Jika sudah tidak terpenuhi, lompat ke langkah 4
- Kali
- Lakukan :
- Bagi
dengan 2
- Tambahkan
dengan 1
- Periksa apakah kondisi
masih terpenuhi.
- Jika masih terpenuhi, kembali ke langkah 3.4
- Jika sudah tidak terpenuhi, lompat ke langkah 4
- Bagi
- Ambil
- Bagian tidak bulat :
- Ambil
- Periksa apakah kondisi
terpenuhi.
- Jika terpenuhi : lanjut ke langkah 4.3
- Jika tidak terpenuhi : lompat ke langkah 5
- Periksa apakah kondisi
terpenuhi.
- Jika terpenuhi :
- Kuadratkan
- Bagi
oleh 2
- Kembali ke langkah 4.2
- Kuadratkan
- Jika tidak terpenuhi :
- Bagi
oleh 2
- Tambahkan
dengan
- Kembali ke langkah 4.2
- Bagi
- Jika terpenuhi :
- Ambil
- Hasil akhir algoritma adalah
Berikut penulis sajikan pseudo-code yang lebih formal :

Implementasi
Java : Ideone, PDF
C++ : Sabar subur
Python : Logarithm Function
Contoh eksekusi algoritma :
1. Contoh menghitung 
Nilai
Ambil
Periksa rentang :
Menghitung bagian bulat
Nilai
Menghitung bagian tidak bulat
Nilai
Hasil akhir
Dengan demikian
2. Contoh menghitung 
Nilai
Ambil
Periksa rentang :
Menghitung bagian bulat
Nilai
Menghitung bagian tidak bulat
Nilai
Hasil akhir
Dengan demikian
3. Contoh menghitung 
Nilai
Ambil
Periksa rentang :
Menghitung bagian bulat :
Nilai
Menghitung bagian tidak bulat :
Nilai
Hasil akhir :
Dengan demikian
Atas nama kerapihan, angka-angka pada perhitungan di atas telah “dipotong” dari angka yang sebenarnya. Pembaca mungkin akan mendapatkan angka yang berbeda jika meng-implementasi dan menjalnkan algoritma ini di dalam komputer ataupun kalkulator.
Hasil perhitungan-perhitungan di atas menggunakan ketelitian 0.01 dari hasil sebenarnya, sehingga ketika di-cross check akan memberikan angka yang tidak terlalu tepat.
Sebagai masukan, penulis biasanya menggunakan ketelitian agar mendapatkan hasil yang cukup dekat dengan hasil yang sebenarnya. Selain itu, ketelitian tersebut masih sangat mungkin dilakukan pada tipe data “floating point” pada komputer 32 bit yang sehari-harinya penulis gunakan. Di dalam artikel ini, penulis secara sengaja menggunakan ketelitian
agar contoh eksekusi algoritma tidak terlalu panjang.
Sekali lagi, untuk mencari logaritma dalam basis lain dapat menggunakan invarian . Selamat mencoba.
