Aplikasi kalkulator? Siapa pun bisa membuatnya, kan?
(chadnauseam.com)"Aplikasi kalkulator? Siapa pun bisa membuatnya" → ternyata tidak benar
- Kalkulator harus menampilkan hasil ekspresi matematika dengan akurat, dan itu jauh lebih sulit daripada yang terlihat
- Pada kalkulator iOS,
(10^100) + 1 − (10^100)salah dihitung menjadi0 - Namun Android dengan benar menampilkan hasil
1, dan cara mereka melakukannya benar-benar tidak masuk akal
Google dan Hans-J. Boehm
- Google mempekerjakan programmer terkenal Hans-J. Boehm
- Boehm adalah pakar yang mendefinisikan semantik variabel bersama di C++
- Namun tugas yang diberikan kepadanya ternyata tidak terduga: mengembangkan aplikasi kalkulator
Masalah floating-point
- Angka floating-point tidak dapat merepresentasikan nilai seperti
0.3atau10^100secara tepat - Artinya, kalkulator yang berbasis floating-point tidak dapat sepenuhnya dipercaya
- Untuk perhitungan yang akurat, diperlukan pendekatan lain
Solusi dengan Bignum
- Masalah perhitungan bilangan bulat dapat diselesaikan dengan menggunakan Bignum (integer tak terbatas)
- Bignum adalah tipe integer yang dapat meluas secara dinamis sesuai ukuran memori
- Masalah
(10^100) + 1 - (10^100)dapat diselesaikan dengan memakai Bignum - Namun operasi pecahan masih belum terselesaikan
Pecahan dan bilangan aljabar
- Pecahan (nilai seperti
3/4) dapat ditangani dengan menyimpan pembilang dan penyebut menggunakan Bignum - Namun bilangan irasional seperti pi (π) atau akar kuadrat (√2) tidak dapat direpresentasikan
- Boehm mencoba pendekatan representasi berbasis polinomial
- Contoh:
√2dapat direpresentasikan dengan persamaanx² - 2 = 0 - Namun π tetap tidak bisa direpresentasikan dengan cara ini
- Contoh:
Bilangan real konstruktif (Constructive Real Numbers)
- Boehm mengeksplorasi konsep "Recursive Real Arithmetic (RRA)"
- Jika pengguna memasukkan tingkat presisi yang diinginkan, nilainya dihitung dalam batas presisi tersebut
- Contoh: jika π direpresentasikan dengan toleransi kesalahan
0.01, maka sistem mengembalikan3.14 - Namun pendekatan ini membuat perbandingan secara tepat menjadi sulit
Masalah merepresentasikan nol yang benar-benar tepat
- Pendekatan RRA bisa saja merepresentasikan
1 - 1bukan sebagai0, melainkan sebagai0.0000000001 - Ini menjadi masalah dari sisi pengalaman pengguna (UX)
- Boehm mulai bekerja sama dengan peneliti lain untuk mencari solusi
Algoritma Richardson-Fitch
- Pada 1994, Dan Richardson dan John Fitch menyelesaikan masalah perbandingan angka dalam operasi tertentu
- Namun algoritma ini terlalu lambat sehingga tidak realistis untuk digunakan
- Misalnya, untuk menentukan
1 ≠ 1 - e^(-e^1000)dibutuhkan lebih banyak operasi daripada jumlah atom di alam semesta
Kombinasi RRA dan operasi rasional
- Boehm mendapatkan ide untuk menggabungkan kelebihan RRA dan operasi bilangan rasional
- Untuk operasi sederhana (misalnya
6 × 9atau8 / 3), digunakan operasi rasional - RRA hanya digunakan ketika bilangan irasional terlibat
- Hasilnya, angka direpresentasikan dalam bentuk rasional × real
Representasi simbolik (Symbolic Representation)
- Angka khusus seperti π dan √2 menggunakan representasi simbolik alih-alih RRA
- Contoh: π disimpan sebagai simbol "π" dan hanya dikonversi menjadi angka saat diperlukan
- Bukan hanya operasi aritmetika dasar, fungsi trigonometri (sin, cos, tan), logaritma, dan fungsi eksponensial juga memanfaatkan representasi simbolik
Solusi akhir
- Semua angka disimpan dalam bentuk rasional × real (representasi simbolik atau RRA)
- Jika memungkinkan, operasi rasional digunakan untuk menjaga ketepatan
- Representasi simbolik dimanfaatkan semaksimal mungkin untuk meminimalkan operasi RRA
- Hasilnya, tercipta sistem kalkulator yang sempurna dengan keseimbangan antara kecepatan dan akurasi
Kesimpulan
- Kalkulator Android yang dibuat Boehm dan timnya bukanlah program sederhana
- Ia menerapkan algoritma yang cepat dan efisien sambil tetap memberikan hasil yang akurat
- Ini bukan sekadar "aplikasi kalkulator", melainkan sistem yang canggih secara matematis
"Saat berikutnya Anda menggunakan kalkulator Android, ingatlah upaya besar di baliknya!"
12 komentar
Omong-omong, menarik juga bahwa AI neo menerjemahkannya menjadi 'gitu kan'. Teks aslinya adalah 'Anyone could make that', jadi sebenarnya tidak ada nuansa bercanda seperti itu haha, tapi pas banget.
Saat saya masih mahasiswa S1, ada kelas di mana kami membuat papan 8086 dengan menyoldernya secara manual, lalu menghubungkan keypad angka dan LCD teks, sampai membuat kalkulator (yang hanya melakukan operasi aritmetika dasar) dengan assembly 8086.
Saya berhasil membuat papan dan menghubungkan keypad serta LCD hingga bisa berjalan, tetapi tidak berhasil membuat kalkulatornya.
Saat itu saya berpikir saya tidak berbakat di bidang perangkat lunak, jadi saya bekerja sebagai insinyur perangkat keras, tetapi entah bagaimana sekarang saya justru mengembangkan perangkat lunak.
Kalkulator itu benar-benar sulit.
Bukan geojana -> yang benar geojanha. 😃
Menyesuaikan floating point bakal bikin pusing, kan? wkwkwk
Kalau mendengar aplikasi kalkulator, saya jadi teringat kalkulator bawaan Windows. Jika menghitung 2+2*2, hasilnya bukan 6 melainkan 8. Sepertinya memang sengaja dibuat seperti itu, tapi saya sama sekali tidak memahaminya. Dulu saya pernah menghitung jumlah alkohol dalam koktail, lalu hasilnya justru lebih banyak daripada total volume minumannya, jadi saya sempat bingung.
Ini mengikuti cara kerja kalkulator elektronik biasa, di mana setiap kali operator ditekan, ekspresi sebelumnya langsung dihitung; apa Anda hanya pernah memakai kalkulator ilmiah?
Saya benar-benar setuju. Saya mulai dengan kalkulator karena bagus tidak perlu server, tapi akhirnya sangat kewalahan harus menangani error perhitungan dan bug yang terus bermunculan.
Gambaran umum implementasi dalam source code
Penjelasan logika operasi kalkulator dalam source code
Kode pemrosesan bilangan bulat
Kode pemrosesan bilangan riil
"Aplikasi kalkulator? Siapa pun bisa bikin kok" → ternyata tidak
Ini kelihatannya bisa diterapkan ke banyak hal banget wkwk
"Python? Gampang banget kok" → ternyata tidak
Saya juga berpikir hal yang sama saat melihatnya. hahaha
"JavaScript? Gampang banget" → ternyata tidak
Aplikasi kalkulator? Bukannya semua orang bisa membuatnya?
"(10^100)+1−(10^100)"Wah, ternyata kalkulator iPhone menampilkan 0, sedangkan kalkulator Android menampilkan 1.
Tapi saat dicari di Google, hasilnya justru muncul 0...
Komentar Hacker News