Soalan:
Dokumentasi MSDN untuk System.Double.Epsilon menyatakan bahawa ia tidak boleh digunakan sebagai margin perbezaan untuk menentukan kesaksamaan. Bagaimanakah Double.Epsilon harus digunakan untuk perbandingan titik terapung?
Jawapan:
Pernyataan MSDN mengelirukan. Double.Epsilon mewakili nilai titik terapung bukan sifar terkecil yang boleh diwakili. Oleh itu, ia boleh digunakan sebagai epsilon dalam contoh yang disediakan dalam benang Limpahan Tindanan "Apakah cara yang paling berkesan untuk apungan dan perbandingan berganda?"
Untuk kesamarataan, epsilon yang sesuai boleh dianggarkan sebagai Matematik. Maks(Math.Abs(x), Math.Abs(y)) * 1E-15, dengan x dan y ialah nilai berganda yang dibandingkan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa ralat pemangkasan boleh terkumpul, jadi epsilon yang lebih besar mungkin diperlukan apabila membandingkan nilai yang dikira.
Untuk melaksanakan kesamaan, lebih besar daripada, kurang daripada, kurang daripada atau sama dengan, dan lebih besar daripada atau sama dengan, kod berikut boleh digunakan:
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; } public static bool GreaterThan(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x > y + epsilon; } public static bool LessThan(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x < y - epsilon; } public static bool LessThanOrEqualTo(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x <= y + epsilon; } public static bool GreaterThanOrEqualTo(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x >= y - epsilon; }
Atas ialah kandungan terperinci Bagaimanakah Double.Epsilon Perlu Digunakan untuk Perbandingan Titik Terapung yang Tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!