Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Harus Membandingkan Nombor Titik Terapung untuk Kesamaan dan Ketaksamaan?

Bagaimanakah Saya Harus Membandingkan Nombor Titik Terapung untuk Kesamaan dan Ketaksamaan?

DDD
DDDasal
2025-01-06 01:09:38390semak imbas

How Should I Compare Floating-Point Numbers for Equality and Inequality?

Menentukan Kesamaan Nombor Titik Terapung Menggunakan Double.Epsilon

Dokumentasi MSDN mencadangkan menggunakan nilai yang lebih besar daripada pemalar Double.Epsilon untuk mewujudkan margin perbezaan mutlak yang boleh diterima apabila menentukan sama ada dua nombor titik terapung boleh dianggap sama. Walau bagaimanapun, pengesyoran ini menimbulkan sedikit kekeliruan.

Adakah Double.Epsilon Mempunyai Penggunaan Praktikal dalam Perbandingan?

Perkataan MSDN telah membawa kepada salah faham tentang penggunaan praktikal Double. Epsilon. Seperti yang dinyatakan dalam jawapan yang disediakan, Double.Epsilon mewakili nilai titik terapung bukan denormal yang boleh diwakili terkecil iaitu bukan 0. Ia hanya menunjukkan saiz minimum ralat pemangkasan, bukan margin yang boleh diterima untuk perbandingan.

Mengira Epsilon yang Sesuai untuk Perbandingan Kesaksamaan

Untuk perbandingan kesaksamaan, pendekatan yang lebih praktikal adalah menggunakan epsilon berdasarkan magnitud nilai yang dibandingkan. 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;
}

Kaedah ini menggunakan nilai mutlak yang lebih besar bagi dua nombor yang didarab dengan pemalar kecil (1E-15) untuk menentukan margin yang boleh diterima untuk perbandingan.

Mempertimbangkan Lebih Besar Daripada dan Kurang Daripada Perbandingan

Untuk perbandingan seperti lebih besar daripada atau kurang daripada, prinsip yang sama berlaku. Epsilon hendaklah dikira berdasarkan magnitud nombor yang dibandingkan untuk mengambil kira ralat pemangkasan yang berpotensi.

Pelaksanaan Terbaik untuk Perbandingan Kesaksamaan dan Ketaksamaan

Ringkasnya, Berganda .Epsilon tidak boleh digunakan secara langsung sebagai margin yang boleh diterima untuk kesaksamaan, lebih besar daripada, kurang daripada, kurang daripada atau sama dengan, atau lebih besar daripada atau sama dengan perbandingan untuk nombor titik terapung. Sebaliknya, epsilon khusus konteks harus dikira untuk memastikan perbandingan yang tepat.

Atas ialah kandungan terperinci Bagaimanakah Saya Harus Membandingkan Nombor Titik Terapung untuk Kesamaan dan Ketaksamaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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