Kebijaksanaan umum bahwa angka floating-point tidak dapat dibandingkan untuk kesetaraan adalah tidak akurat. Bilangan floating-point tidak berbeda dari bilangan bulat: Jika Anda mengevaluasi "a == b", Anda akan menjadi kenyataan jika bilangan itu identik dan salah (dengan pengertian bahwa dua NaN tentu saja bukan bilangan identik).
Masalah sebenarnya adalah ini: Jika saya telah melakukan perhitungan dan tidak yakin dua angka yang harus saya bandingkan benar, lalu apa? Masalah ini sama untuk floating-point seperti halnya untuk bilangan bulat. Jika Anda mengevaluasi ekspresi integer "7/3 * 3", itu tidak akan sama dengan "7 * 3/3".
Jadi misalkan kita bertanya, "Bagaimana cara membandingkan bilangan bulat untuk kesetaraan?" dalam situasi seperti itu. Tidak ada jawaban tunggal; apa yang harus Anda lakukan tergantung pada situasi spesifik, terutama kesalahan apa yang Anda miliki dan apa yang ingin Anda capai.
Berikut beberapa pilihan yang mungkin.
Jika Anda ingin mendapatkan hasil "benar" jika angka yang tepat secara matematis akan sama, maka Anda dapat mencoba menggunakan properti dari perhitungan yang Anda lakukan untuk membuktikan bahwa Anda mendapatkan kesalahan yang sama dalam dua angka. Jika itu layak, dan Anda membandingkan dua angka yang dihasilkan dari ekspresi yang akan memberikan angka yang sama jika dihitung secara tepat, maka Anda akan mendapatkan "benar" dari perbandingan. Pendekatan lain adalah bahwa Anda dapat menganalisis properti perhitungan dan membuktikan bahwa kesalahan tidak pernah melebihi jumlah tertentu, mungkin jumlah absolut atau jumlah relatif terhadap salah satu input atau salah satu output. Dalam hal ini, Anda dapat bertanya apakah dua angka yang dihitung berbeda paling banyak jumlah itu, dan mengembalikan "benar" jika mereka berada dalam interval. Jika Anda tidak dapat membuktikan kesalahan terikat, Anda mungkin menebak dan berharap untuk yang terbaik. Salah satu cara menebak adalah dengan mengevaluasi banyak sampel acak dan melihat jenis distribusi yang Anda dapatkan dalam hasil.
Tentu saja, karena kami hanya menetapkan persyaratan bahwa Anda mendapatkan "benar" jika hasil yang tepat secara matematis sama, kami membiarkan kemungkinan bahwa Anda mendapatkan "benar" walaupun tidak sama. (Faktanya, kita dapat memenuhi persyaratan dengan selalu mengembalikan "benar". Ini membuat perhitungannya sederhana tetapi umumnya tidak diinginkan, jadi saya akan membahas memperbaiki situasi di bawah ini.)
Jika Anda ingin mendapatkan hasil "false" jika angka yang tepat secara matematis tidak sama, Anda perlu membuktikan bahwa evaluasi Anda terhadap angka menghasilkan angka yang berbeda jika angka yang tepat secara matematis tidak sama. Ini mungkin mustahil untuk tujuan praktis dalam banyak situasi umum. Jadi mari kita pertimbangkan alternatifnya.
Persyaratan yang berguna mungkin bahwa kita mendapatkan hasil "salah" jika angka yang tepat secara matematis berbeda lebih dari jumlah tertentu. Sebagai contoh, mungkin kita akan menghitung di mana bola dilemparkan dalam permainan komputer bepergian, dan kami ingin tahu apakah itu memukul kelelawar. Dalam hal ini, kami tentu ingin mendapatkan "benar" jika bola memukul kelelawar, dan kami ingin mendapatkan "salah" jika bola jauh dari kelelawar, dan kami dapat menerima jawaban "benar" yang salah jika bola masuk simulasi matematis yang tepat melewatkan kelelawar tetapi dalam milimeter memukul kelelawar. Dalam hal itu, kita perlu membuktikan (atau menebak / memperkirakan) bahwa perhitungan kita tentang posisi bola dan posisi kelelawar memiliki kesalahan gabungan paling banyak satu milimeter (untuk semua posisi yang menarik). Ini akan memungkinkan kita untuk selalu kembali "
Jadi, bagaimana Anda memutuskan apa yang akan dikembalikan ketika membandingkan angka floating-point sangat tergantung pada situasi spesifik Anda.
Mengenai cara Anda membuktikan batas kesalahan untuk perhitungan, itu bisa menjadi subjek yang rumit. Setiap implementasi floating-point menggunakan standar IEEE 754 dalam mode round-to-terdekat mengembalikan angka floating-point terdekat dengan hasil yang tepat untuk setiap operasi dasar (terutama perkalian, pembagian, penambahan, pengurangan, akar kuadrat). (Dalam kasus seri, bulat sehingga bit rendahnya genap.) (Berhati-hatilah tentang akar kuadrat dan pembagian; implementasi bahasa Anda mungkin menggunakan metode yang tidak sesuai dengan IEEE 754 untuk itu.) Karena persyaratan ini, kita tahu kesalahan dalam hasil tunggal paling banyak 1/2 dari nilai bit paling signifikan. (Jika lebih, pembulatan akan pergi ke nomor yang berbeda yaitu dalam 1/2 nilai.)
Pergi dari sana menjadi jauh lebih rumit; langkah selanjutnya adalah melakukan operasi di mana salah satu input sudah memiliki beberapa kesalahan. Untuk ekspresi sederhana, kesalahan ini dapat diikuti melalui perhitungan untuk mencapai batas kesalahan akhir. Dalam praktiknya, ini hanya dilakukan dalam beberapa situasi, seperti mengerjakan perpustakaan matematika berkualitas tinggi. Dan, tentu saja, Anda perlu kontrol yang tepat atas operasi yang dilakukan. Bahasa tingkat tinggi sering memberi kompiler banyak kelonggaran, jadi Anda mungkin tidak tahu di mana operasi urutan dilakukan.
Ada banyak lagi yang bisa (dan) ditulis tentang topik ini, tetapi saya harus berhenti di situ. Singkatnya, jawabannya adalah: Tidak ada rutinitas perpustakaan untuk perbandingan ini karena tidak ada solusi tunggal yang sesuai dengan sebagian besar kebutuhan yang layak dimasukkan ke dalam rutinitas perpustakaan. (Jika membandingkan dengan interval kesalahan relatif atau absolut sudah mencukupi untuk Anda, Anda dapat melakukannya hanya tanpa rutin perpustakaan.)