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
Lepaskan: 2024-12-25 02:20:09
asal
313 orang telah melayarinya

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

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;
Salin selepas log masuk
  • Gunakan huruf terapung dengan akhiran 'f':
float a = 0.7f;
float b = 0.5f;
Salin selepas log masuk

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!

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