Double.Epsilon untuk Kesamaan dan Operasi Perbandingan
Pemalar Double.Epsilon memegang titik terapung positif terkecil nombor yang boleh diwakili sebagai rangkap dua tanpa membundarkan kepada sifar. Ia bertujuan sebagai panduan untuk perbandingan titik terapung, tetapi dokumentasinya boleh mengelirukan.
Bolehkah Double.Epsilon Digunakan untuk Perbandingan Langsung?
Tidak. Double.Epsilon mentakrifkan ralat pemangkasan terkecil yang mungkin. Ini bermakna apabila menjalankan operasi matematik, nombor titik terapung boleh berbeza lebih daripada Double.Epsilon disebabkan oleh pembundaran. Oleh itu, menggunakan Double.Epsilon untuk perbandingan langsung mungkin tidak menggambarkan kesaksamaan matematik dengan tepat.
Alternatif untuk Perbandingan Tepat
Pertimbangkan alternatif berikut:
public static bool ApproximatelyEqual(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return Math.Abs(x - y) <= epsilon; }
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) { return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance; }
Pelaksanaan untuk Operasi Perbandingan Lain
Untuk melaksanakan perbandingan yang lebih besar daripada (>) dan kurang daripada (<), songsang logik yang digunakan untuk kesaksamaan:
Lebih besar Daripada:
public static bool GreaterThan(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0; }
Kurang Daripada:
public static bool LessThan(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0; }
Untuk lebih besar daripada atau sama dengan (>=) dan kurang daripada atau sama dengan (<=) perbandingan, ubah suai pelaksanaan di atas sewajarnya:
public static bool GreaterThanOrEqual(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) >= 0; } public static bool LessThanOrEqual(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) <= 0; }
Ingat, pelaksanaan ini hanyalah anggaran dan harus digunakan dengan berhati-hati dalam situasi di mana perbandingan yang tepat adalah penting.
Atas ialah kandungan terperinci Bila dan Bagaimana Double.Epsilon Perlu Digunakan untuk Membandingkan Nombor Titik Terapung Ketepatan Berganda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!