Rumah > pembangunan bahagian belakang > C++ > Bila dan Bagaimana Double.Epsilon Perlu Digunakan untuk Membandingkan Nombor Titik Terapung Ketepatan Berganda?

Bila dan Bagaimana Double.Epsilon Perlu Digunakan untuk Membandingkan Nombor Titik Terapung Ketepatan Berganda?

DDD
Lepaskan: 2025-01-05 17:04:43
asal
257 orang telah melayarinya

When and How Should Double.Epsilon Be Used for Comparing Double-Precision Floating-Point Numbers?

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:

  • Pengiraan Epsilon Mudah: Untuk kesamarataan mudah perbandingan, anda boleh menggunakan epsilon kecil berdasarkan magnitud nilai yang dibandingkan. Contohnya:
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;
}
Salin selepas log masuk
  • Toleransi Relatif: Gunakan toleransi relatif untuk mengira perbezaan magnitud. Contohnya:
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance;
}
Salin selepas log masuk

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;
    }
    Salin selepas log masuk
  • Kurang Daripada:

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }
    Salin selepas log masuk

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan