Rumah >pembangunan bahagian belakang >C++ >Mengapa `terapung == berganda` Sentiasa Berfungsi?

Mengapa `terapung == berganda` Sentiasa Berfungsi?

DDD
DDDasal
2024-11-01 04:37:28561semak imbas

Why Doesn't `float == double` Always Work?

Perbandingan Beregu dan Terapung: Mengapa Keputusan Tidak Dijangkakan?

Nombor titik terapung seperti beregu dan terapung memainkan peranan penting dalam pengiraan berangka. Walau bagaimanapun, membandingkan jenis ini boleh membawa kepada hasil yang membingungkan, seperti yang digambarkan oleh coretan kod di bawah:

<code class="python">float f = 1.1
double d = 1.1
if (f == d):  # returns false!</code>

Tingkah laku yang tidak dijangka ini berpunca daripada dua faktor asas: ketepatan dan pembundaran.

Ketepatan:

Nombor titik terapung mempunyai ketepatan terhingga, yang mengehadkan bilangan digit yang boleh diwakili dengan tepat. Nombor dengan ketepatan yang lebih tinggi memerlukan lebih banyak memori, yang tidak selalunya boleh dilaksanakan untuk pembolehubah titik terapung.

Sebagai contoh, pecahan 1/3 dalam perpuluhan (0.33333...) tidak boleh diwakili dengan tepat dalam 32-bit terapung. Ia mesti dianggarkan dan disimpan sebagai 0.3333333333333333, mengakibatkan kehilangan ketepatan yang kecil.

Pembulatan:

Nombor perduaan dan perpuluhan mempunyai perbezaan yang wujud. Pecahan yang boleh diwakili dengan mudah dalam perpuluhan (cth., 1/10 sebagai 0.1) selalunya memerlukan perwakilan kompleks dalam perduaan (cth., 1/10 sebagai 0.0001100110011...).

Percanggahan ini membawa kepada ralat pembundaran, di mana nilai titik terapung dipotong agar muat dalam had ingatan. Akibatnya, perwakilan 0.1 dalam kod contoh mungkin tidak betul-betul sama dengan 0.1 yang disimpan dalam double.

Kesimpulan:

Disebabkan oleh isu ketepatan dan pembundaran , membandingkan double dan float menggunakan kesamaan (==) tidak boleh dipercayai. Sebaliknya, pendekatan yang lebih mantap ialah membandingkan perbezaan mutlaknya kepada nilai epsilon yang boleh diterima. Ini memastikan bahawa perbezaan berada dalam toleransi yang boleh diterima.

<code class="python">if abs(f - d) < epsilon:  # epsilon is a small threshold</code>

Pendekatan ini memastikan perbandingan tidak dipengaruhi oleh ketepatan dan ralat pembundaran, yang membawa kepada keputusan yang tepat dan konsisten.

Atas ialah kandungan terperinci Mengapa `terapung == berganda` Sentiasa Berfungsi?. 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