Rumah > pembangunan bahagian belakang > C++ > Mengapa Perbandingan Titik Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Perbandingan Titik Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?

Mary-Kate Olsen
Lepaskan: 2024-12-17 01:21:25
asal
371 orang telah melayarinya

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

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

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:

  1. Tukar apungan kepada dua kali ganda: Dengan mengisytiharkan a dan b sebagai beregu, anda pastikan ianya tidak dinaikkan semasa perbandingan, dan gelagat yang dijangkakan akan diperolehi.
  2. Tambahkan akhiran f pada literal: Dengan menambahkan imbuhan f pada literal, anda dengan jelas menunjukkan bahawa ia harus diperlakukan sebagai terapung. Ini akan menghalang promosi menjadi dua kali ganda semasa perbandingan.

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!

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