Double.Epsilon dalam Perbandingan Titik Terapung
Soalan:
Dokumentasi MSDN untuk Double.Epsilon menyatakan bahawa ia tidak boleh digunakan untuk menentukan kesamaan antara nombor titik terapung. Walau bagaimanapun, beberapa sumber mencadangkan menggunakannya untuk perbandingan. Adakah mungkin untuk menggunakan Double.Epsilon untuk kesamaan dan perbandingan lain, seperti lebih besar daripada dan kurang daripada?
Jawapan:
Nilai Epsilon mewakili bukan yang boleh diwakili terkecil -nilai titik terapung denormal selain daripada 0. Walaupun ia mungkin kelihatan seperti calon semula jadi untuk epsilon dalam perbandingan, ia tidak cukup tepat untuk itu tujuan.
Double.Epsilon mencerminkan ralat pemangkasan yang boleh diwakili terkecil, tetapi ia sangat berbeza bergantung pada magnitud nombor yang dibandingkan. Sebagai contoh, untuk dua nombor yang hampir dengan 1, Double.Epsilon mungkin 0.0000000000000002220446, manakala untuk dua nombor yang hampir dengan 1,000,000,000,000,000, ia boleh menjadi 222,044,604,925,093. Ini bermakna bergantung pada Double.Epsilon untuk kesamaan atau perbandingan lain tidak akan memberikan hasil yang konsisten.
Anggaran Epsilon Alternatif untuk Kesaksamaan:
Satu pendekatan yang disyorkan untuk membandingkan terapung- nilai mata untuk kesamaan adalah dengan menggunakan epsilon pemalar * 1E-15. Ini menganggarkan bahawa jenis Double boleh mewakili nilai dengan tepat hingga 15 digit. Contohnya:
public static bool AboutEqual(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return Math.Abs(x - y) <= epsilon; }
Operator Perbandingan:
Walaupun Double.Epsilon tidak boleh digunakan terus untuk perbandingan, kaedah AboutEqual boleh disesuaikan untuk lebih daripada, kurang daripada , kurang daripada atau sama dengan, dan lebih besar daripada atau sama dengan:
Pertimbangan Tambahan:
Adalah penting untuk ambil perhatian bahawa ralat pemangkasan boleh terkumpul, terutamanya apabila berurusan dengan nilai yang dikira. Oleh itu, anda mungkin perlu melaraskan nilai epsilon dengan sewajarnya untuk mencapai ketepatan yang sesuai.
Atas ialah kandungan terperinci Patutkah Saya Menggunakan Double.Epsilon untuk Perbandingan Titik Terapung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!