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

Mengapa Perbandingan Titik Terapung Saya Menghasilkan Keputusan Yang Tidak Dijangka?

Patricia Arquette
Patricia Arquetteasal
2024-12-25 02:20:09390semak imbas

Why Does My Floating-Point Comparison Produce Unexpected Results?

Perbezaan Perbandingan Titik Terapung

Dalam coretan kod yang disediakan:

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");
}

output yang dijangkakan bagi "0 ialah betul" tidak diperolehi. Sebaliknya, "1 betul" dicetak. Percanggahan ini timbul disebabkan oleh ketidaktepatan yang wujud bagi nombor titik terapung.

Apabila melakukan perbandingan dengan operan titik terapung, ia dinaikkan secara automatik kepada nilai ketepatan dua kali. Terapung, kurang tepat daripada beregu, mungkin tidak mewakili nilai yang dimaksudkan dengan tepat. Dalam kes ini, apabila a (apungan) dibandingkan dengan 0.7 (dua kali ganda), a secara dalaman ditukar kepada dua kali ganda dan kehilangan ketepatan. Ini mengakibatkan kurang sedikit daripada 0.7, menyebabkan a < 0.7 perbandingan untuk menilai kepada benar.

Untuk menyelesaikan isu ini, seseorang boleh sama ada:

  • Tukar apungan kepada dua kali ganda:
double a = 0.7;
double b = 0.5;
  • Gunakan huruf terapung dengan akhiran 'f':
float a = 0.7f;
float b = 0.5f;

Kedua-dua pendekatan memastikan bahawa operan kekal sebagai terapung dan mengelakkan kehilangan ketepatan semasa promosi menjadi dua kali ganda.

Atas ialah kandungan terperinci Mengapa Perbandingan Titik Terapung Saya 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