Rumah >pembangunan bahagian belakang >C++ >Mengapa Perbandingan Titik Terapung Tidak Tepat, dan Bagaimana Saya Boleh Memastikan Keputusan yang Betul?

Mengapa Perbandingan Titik Terapung Tidak Tepat, dan Bagaimana Saya Boleh Memastikan Keputusan yang Betul?

Patricia Arquette
Patricia Arquetteasal
2024-12-19 17:26:101013semak imbas

Why Are Floating-Point Comparisons Inaccurate, and How Can I Ensure Correct Results?

Kekeliruan Perbandingan Titik Terapung

Dalam coretan kod yang diberikan, semakan perbandingan antara nombor titik terapung tidak semudah yang dijangkakan . Apabila berurusan dengan perbandingan titik terapung, adalah penting untuk memahami perwakilan titik terapung dan kemungkinan perangkap yang timbul.

Perangkap Titik Terapung

Isu dengan kod itu terletak pada perbandingan nombor titik terapung. Nombor titik terapung disimpan dalam format binari yang menggunakan bilangan bit terhingga untuk mewakili kedua-dua magnitud dan eksponen. Ini bermakna terdapat had yang wujud dalam ketepatan nombor titik terapung boleh mewakili nilai tertentu, yang membawa kepada ralat pembundaran.

Dalam kod yang disediakan, pembolehubah a dan b ditakrifkan sebagai apungan. Apabila membandingkan a kepada 0.7, pengkompil mempromosikan apungan kepada dua kali ganda untuk perbandingan. Promosi jenis ini boleh mengakibatkan kehilangan ketepatan, kerana perwakilan berganda a mungkin tidak betul-betul sama dengan 0.7. Tambahan pula, 0.5 ialah kuasa tepat 2, yang boleh diwakili dengan tepat dalam format titik terapung.

Akibatnya, perbandingan a < 0.7 akan dinilai kepada benar disebabkan oleh kenaikan pangkat kepada gandaan dan perwakilan tidak tepat 0.7. Ini menerangkan output yang tidak dijangka bagi "1 adalah betul" dan bukannya jangkaan "0 adalah betul."

Memastikan Perbandingan yang Betul

Untuk mengelakkan isu sedemikian, terdapat dua pendekatan yang mungkin:

  • Gunakan beregu bukannya apungan: Dengan mentakrifkan a dan b sebagai beregu (double a = 0.7; double b = 0.5;), anda boleh memastikan bahawa perbandingan dilakukan dengan ketepatan penuh beregu, mengurangkan risiko ralat pembundaran.
  • Gunakan akhiran titik terapung: Sebagai alternatif, anda boleh menambahkan akhiran f pada literal titik terapung untuk memaksa pengkompil merawat mereka sebagai terapung semasa perbandingan. Pendekatan ini membolehkan anda mengekalkan jenis apungan sambil memastikan ketepatan yang betul: jika (a < 0.7f).

Atas ialah kandungan terperinci Mengapa Perbandingan Titik Terapung Tidak Tepat, dan Bagaimana Saya Boleh Memastikan Keputusan yang Betul?. 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