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; } };
Fungsi pembanding ini kemudiannya boleh dihantar kepada pembina std::map untuk menggunakan perbandingan anggaran:
std::map<double, double, fuzzy_double_comparator> mymap;
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!