Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Nilai Titik Terapung Boleh Dibandingkan Dengan Tepat Semasa Mengakaunkan Kerugian Ketepatan?

Bagaimanakah Nilai Titik Terapung Boleh Dibandingkan Dengan Tepat Semasa Mengakaunkan Kerugian Ketepatan?

Susan Sarandon
Susan Sarandonasal
2024-12-25 07:48:33807semak imbas

How Can Floating-Point Values Be Compared Accurately While Accounting for Precision Loss?

Membandingkan Nilai Titik Terapung dengan Pemuliharaan Ketepatan

Perbandingan titik terapung menimbulkan cabaran kerana kehilangan ketepatan. Hanya membandingkan beregu atau apungan menggunakan == tidak boleh dipercayai.

Perbandingan berasaskan Epsilon

Satu pendekatan melibatkan penggunaan ambang epsilon (ε) untuk mengambil kira kehilangan ketepatan:

bool CompareDoubles2(double A, double B) {
  double diff = A - B;
  return (diff < EPSILON) && (-diff < EPSILON);
}

Walau bagaimanapun, pendekatan ini boleh tidak cekap.

Pertimbangan Bergantung Konteks

Pilihan kaedah perbandingan bergantung pada konteks dan nilai yang dijangkakan. Pertimbangkan kemungkinan perangkap berikut:

  • Menganggap a == b dan b == c membayangkan a == c.
  • Menggunakan epsilon yang sama untuk unit ukuran yang berbeza.
  • Menggunakan epsilon untuk kedua-dua sudut dan panjang garis.
  • Isih menggunakan perbandingan sedemikian fungsi.

Epsilon Standard

std::numeric_limits::epsilon() mewakili perbezaan antara 1.0 dan nilai seterusnya yang boleh diwakili oleh double . Ia boleh digunakan dalam fungsi perbandingan, tetapi hanya jika nilai yang dijangkakan adalah kurang daripada 1.

Akibat Aritmetik Integer

Menggunakan dua kali ganda untuk memegang nilai integer boleh membawa kepada pembetulan aritmetik, selagi pecahan atau nilai di luar julat integer dielakkan. Contohnya, 4.0/2.0 akan bersamaan dengan 1.0 1.0.

Atas ialah kandungan terperinci Bagaimanakah Nilai Titik Terapung Boleh Dibandingkan Dengan Tepat Semasa Mengakaunkan Kerugian Ketepatan?. 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