Rumah > pembangunan bahagian belakang > C++ > Cara Menggunakan `std::map` dengan Kekunci Titik Terapung: Penyelesaian untuk Perbandingan Tidak Tepat?

Cara Menggunakan `std::map` dengan Kekunci Titik Terapung: Penyelesaian untuk Perbandingan Tidak Tepat?

DDD
Lepaskan: 2024-11-14 22:15:03
asal
652 orang telah melayarinya

How to Use `std::map` with Floating-Point Keys: A Solution for Inaccurate Comparisons?

std::map Perbandingan Kunci Titik Terapung

Menggunakan nilai titik terapung sebagai kunci dalam std::peta boleh menimbulkan cabaran kerana ketaktepatan yang wujud bagi aritmetik titik terapung. Satu isu biasa ialah membandingkan kekunci titik terapung menggunakan kesamaan yang ketat (==) mungkin tidak selalu berfungsi seperti yang dijangkakan, malah nilai yang kelihatan tepat mungkin tidak sepadan disebabkan ralat ketepatan.

Dalam contoh kod yang diberikan, gelung cuba mencari kunci 3.0 dalam std::map, tetapi gagal kerana gelung menambah kunci carian menggunakan = 0.1, yang mungkin tidak sepadan dengan nilai kunci yang dijangkakan kerana ketidaktepatan ketepatan titik terapung.

Untuk menangani isu ini, anda boleh menggunakan fungsi std::setprecision dalam program anda untuk menentukan bilangan tempat perpuluhan yang perlu dipertimbangkan semasa membandingkan kekunci. Walau bagaimanapun, pendekatan ini masih tidak boleh dipercayai kerana ia tidak menjamin bahawa kekunci akan membandingkan dengan tepat.

Penyelesaian yang lebih baik ialah menggunakan fungsi perbandingan anggaran dalam std::map anda. Anda boleh menentukan pembanding tersuai yang menggunakan ambang epsilon untuk menentukan kesaksamaan utama. Ini membolehkan anda membandingkan kunci dalam toleransi tertentu, dengan berkesan mengabaikan perbezaan ketepatan kecil:

struct fuzzy_double_comparator {
    bool operator() (const double a, const double b) const {
        return std::fabs(a - b) < epsilon;
    }
};
Salin selepas log masuk

Fungsi pembanding ini kemudiannya boleh dihantar kepada pembina std::map untuk menggunakan perbandingan anggaran:

std::map<double, double, fuzzy_double_comparator> mymap;
Salin selepas log masuk

Dengan pendekatan ini, anda boleh menemui kunci 3.0 dalam std::map walaupun nilai sebenarnya berbeza sedikit disebabkan oleh had ketepatan titik terapung.

Atas ialah kandungan terperinci Cara Menggunakan `std::map` dengan Kekunci Titik Terapung: Penyelesaian untuk Perbandingan Tidak Tepat?. 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