59 poin oleh GN⁺ 2025-02-17 | 12 komentar | Bagikan ke WhatsApp

"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 menjadi 0
  • 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.3 atau 10^100 secara 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: √2 dapat direpresentasikan dengan persamaan x² - 2 = 0
    • Namun π tetap tidak bisa direpresentasikan dengan cara ini

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 mengembalikan 3.14
  • Namun pendekatan ini membuat perbandingan secara tepat menjadi sulit

Masalah merepresentasikan nol yang benar-benar tepat

  • Pendekatan RRA bisa saja merepresentasikan 1 - 1 bukan sebagai 0, melainkan sebagai 0.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 × 9 atau 8 / 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

 
street62 2025-02-20

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.

 
gurugio 2025-02-19

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.

 
yunsub2 2025-02-19

Bukan geojana -> yang benar geojanha. 😃

 
carnoxen 2025-02-18

Menyesuaikan floating point bakal bikin pusing, kan? wkwkwk

 
tribela 2025-02-18

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.

 
khrad 2025-02-19

Ini mengikuti cara kerja kalkulator elektronik biasa, di mana setiap kali operator ditekan, ekspresi sebelumnya langsung dihitung; apa Anda hanya pernah memakai kalkulator ilmiah?

 
ned0909 2025-02-18

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.

 
aer0700 2025-02-17

"Aplikasi kalkulator? Siapa pun bisa bikin kok" → ternyata tidak
Ini kelihatannya bisa diterapkan ke banyak hal banget wkwk

"Python? Gampang banget kok" → ternyata tidak

 
tsboard 2025-02-17

Saya juga berpikir hal yang sama saat melihatnya. hahaha

"JavaScript? Gampang banget" → ternyata tidak

 
joyfui 2025-02-17

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...

 
GN⁺ 2025-02-17
Komentar Hacker News
  • Cerita yang menarik. Cara yang lebih kuat untuk merepresentasikan angka adalah dengan pecahan berlanjut. Pecahan berlanjut dapat merepresentasikan bilangan real dan bilangan rasional secara efisien
    • Fakta menariknya, menurut buku teks matematika yang tidak terlalu lama, kemungkinan besar algoritme penjumlahan/perkalian untuk pecahan berlanjut tidak ada. Namun, pada 1972 Bill Gosper membuktikan bahwa pecahan berlanjut sangat cocok untuk aritmetika
    • Saya sedang mengerjakan library Python bernama reals. Library ini dirancang untuk dapat menggantikan tipe Decimal atau Fraction. Library ini memanipulasi pecahan berlanjut menggunakan teknik Bill Gosper
  • Sangat disayangkan tautannya dipersingkat sehingga tidak bisa diklik. Ini tautan asli ke makalahnya
  • Begitu membaca judulnya saya langsung tertawa. IEEE 754 itu yang terburuk, tapi masih lebih baik daripada semua alternatif lain. Begitu melihat contohnya, saya mengira ini akan membahas Kahan summation atau sistem aljabar komputer penuh. Saya belum pernah mendengar tentang Recursive Real Arithmetic
    • Saya jadi mendapat wawasan tentang salah satu pahlawan awal C++. Ini mengingatkan bahwa hal-hal yang terlihat sederhana bisa sedalam itu
  • Tarif kereta bawah tanah NYC adalah $2.90. Saat saya memakai PCalc di iOS untuk menghitung sisa nilai MetroCard, hasilnya bukan 0 melainkan -8.881784197E-16. Hal seperti ini tidak terjadi saat memakai kalkulator Apple
    • Saya menghubungi developernya, dan diberi tahu bahwa Apple menggunakan library matematika mereka sendiri, jadi mereka harus mencari library lain untuk menggantikannya
  • Hampir tidak ada orang yang membuat aplikasi kalkulator yang benar-benar lengkap. Maksud saya kalkulator lengkap seperti TI-89
    • Saya memakai emulator kalkulator TI-89 di Android. Fungsinya bahkan tidak sampai setengah dari aplikasi Android, dan juga tidak bekerja dengan baik
  • Kekurangan beralih ke RRA bukan cuma pada pengalaman pengguna. Saat hasilnya 0.0000000..., kalkulator tidak bisa menentukan apakah kebalikan dari angka itu dapat dihitung
    • Misalnya, 1/(atan(1/5)-atan(1/239)-pi/4) menghasilkan "tidak dapat dihitung". Bahkan jika mencoba 1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000)), hasilnya tetap "tidak dapat dihitung"
  • Hampir semua angka tidak dapat direpresentasikan dengan floating point IEEE. Kemungkinannya bahwa sebuah angka acak secara teoretis tidak dapat dijelaskan mungkin mendekati 100%
    • Beberapa masalah bisa dihindari dengan memakai bignums. Krisis eksistensial sesaat pun mereda
  • Adakah yang tahu apakah kalkulator TI kelas atas, misalnya TI-92, memakai sistem ini? Ada mode "rasional", jadi mungkin saja memakai RRA
  • Cara penggunaan "recursive real arithmetic" (RRA) mengingatkan saya pada diskusi hebat dengan Conal Elliot. Kami membahas perpindahan dari merepresentasikan sesuatu secara diskret ke merepresentasikannya secara kontinu
    • Misalnya, dulu font direpresentasikan sebagai blok piksel, tetapi sekarang dipahami sebagai garis/vektor. Ilmu komputer seharusnya bukan hanya soal mempelajari alat komersial terbaru, tetapi juga mengejar kebenaran
  • Saya pernah bermain-main dengan source code kalkulator Android Open Source Project. Google sudah memindahkannya ke Google Play Services, tetapi source lama masih tersedia
    • Ini menyelesaikan beberapa masalah nyata, dan saya berharap bisa tersedia di library. Di artikel sebelumnya ada pembahasan tentang beberapa library