Rumah > pembangunan bahagian belakang > C++ > Patutkah Saya Menggunakan Double.Epsilon untuk Perbandingan Titik Terapung?

Patutkah Saya Menggunakan Double.Epsilon untuk Perbandingan Titik Terapung?

Linda Hamilton
Lepaskan: 2025-01-05 04:58:42
asal
526 orang telah melayarinya

Should I Use Double.Epsilon for Floating-Point Comparisons?

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;
}
Salin selepas log masuk

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:

  • Lebih besar daripada: x > y && !AboutEqual(x, y)
  • Kurang daripada: x < y && !AboutEqual(x, y)
  • Kurang daripada atau sama dengan: AboutEqual(x, y) || x < y
  • Lebih besar daripada atau sama dengan: AboutEqual(x, y) || x > y
  • 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan