Rumah >pembangunan bahagian belakang >C++ >Mengapa Perbandingan Titik Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?
Anomali Perbandingan Titik Terapung
Konsep perbandingan titik terapung boleh mengelirukan, terutamanya apabila berurusan dengan jenis data terapung. Pertimbangkan contoh berikut:
int main() { float a = 0.7; float b = 0.5; if (a < 0.7) { if (b < 0.5) printf("2 are right"); else printf("1 is right"); } else printf("0 are right"); }
Secara intuitif, seseorang mungkin menganggap kod ini akan mengeluarkan "0 adalah betul" kerana syarat awal adalah palsu. Walau bagaimanapun, yang menghairankan, output sebenar ialah "1 betul."
Penjelasan
Penjelasan terletak pada perwakilan dalaman nombor titik terapung. Dalam C, apungan dinaikkan kepada beregu semasa perbandingan, dan beregu adalah lebih tepat daripada apungan. Akibatnya, 0.7 sebagai apungan tidak betul-betul sama dengan 0.7 sebagai gandaan. Apabila 0.7 (sebagai apungan) dinaikkan kepada dua kali ganda, ia menjadi kurang sedikit daripada 0.7 (sebagai dua kali ganda).
Sebaliknya, 0.5 (sebagai apungan) kebetulan merupakan perwakilan tepat dalam dua kali ganda. ketepatan. Oleh itu, apabila keadaan b < 0.5 dinilai, ia mengembalikan palsu kerana 0.5 (sebagai gandaan) tidak kurang daripada dirinya sendiri.
Penyelesaian
Untuk menyelesaikan isu ini, seseorang boleh sama ada:
Dengan melaksanakan salah satu daripada penyelesaian ini, anda boleh memperoleh output yang dikehendaki iaitu "0 betul."
Atas ialah kandungan terperinci Mengapa Perbandingan Titik Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!