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

Mengapa Membandingkan Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 04:18:09494semak imbas

Why Does Comparing Floats in C   Sometimes Produce Unexpected Results?

Memahami Perbandingan Titik Terapung dalam C

Apabila membandingkan nilai titik terapung dalam C , adalah penting untuk mengetahui potensi ketidaktepatan disebabkan oleh ketepatan terhad. Dalam coretan kod yang disediakan, output yang tidak dijangka "1 adalah betul" diperhatikan apabila membandingkan apungan a dan b dengan pemalar 0.7 dan 0.5, masing-masing.

Punca Output Tidak Dijangka:

Isu ini timbul kerana perkara berikut sebab:

  • Penukaran Jenis Tersirat: Apabila membandingkan apungan kepada dua kali ganda (cth., jika (a < 0.7)) atau apungan kepada pemalar literal iaitu dua kali ganda (cth., jika (a < .7)), apungan secara tersirat ditukar kepada dua kali ganda.
  • Ketepatan Terhad Terapung: Terapung mempunyai ketepatan yang lebih rendah daripada dua kali ganda, bermakna ia boleh mewakili lebih sedikit tempat perpuluhan dengan tepat. Akibatnya, 0.7 sebagai apungan mungkin tidak betul-betul sama dengan 0.7 sebagai dua kali ganda.
  • Perwakilan Tepat Pemalar: Pemalar seperti 0.5 yang merupakan kuasa 2 boleh diwakili sama seperti terapung dan berganda. Oleh itu, b < 0.5 kekal palsu walaupun b adalah apungan yang sedikit tidak tepat.

Penyelesaian:

Untuk mendapatkan output yang dijangkakan, anda boleh sama ada:

  • Gunakan Beregu: Tukar pembolehubah a dan b kepada berganda (berganda a = 0.7; double b = 0.5;).
  • Gunakan Terapung Literal: Ubah suai pemalar kepada terapung literal (jika (a < 0.7f) dan jika (b < 0.5f )). Ini memaksa perbandingan untuk menggunakan terapung di seluruh.

Kod dengan Output Jangkaan:

int main()
{
    double a = 0.7;
    double 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");
}

Dalam kod yang diperbetulkan ini, perbandingan a dan b kepada beregu masing-masing memastikan ketepatan yang tepat, menghasilkan output yang dijangkakan "0 adalah betul."

Atas ialah kandungan terperinci Mengapa Membandingkan Terapung dalam C Kadangkala Menghasilkan Keputusan Yang Tidak Dijangka?. 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