Rumah >pembangunan bahagian belakang >C++ >Mengapa Penambahan Titik Terapung Tidak Sentiasa Mengikut Undang-undang Bersekutu?

Mengapa Penambahan Titik Terapung Tidak Sentiasa Mengikut Undang-undang Bersekutu?

Patricia Arquette
Patricia Arquetteasal
2024-12-14 17:51:10867semak imbas

Why Does Floating-Point Addition Not Always Follow the Associative Law?

Aritmetik Titik Terapung: Associativity in Question

Apabila ia melibatkan operasi matematik, associativity menentukan bahawa susunan operan tidak mempengaruhi hasil. Walau bagaimanapun, dalam bidang aritmetik titik terapung, persekutuan tidak selalunya berlaku. Ini boleh membawa kepada hasil yang tidak dijangka, seperti yang digambarkan oleh isu biasa yang dihadapi oleh pengaturcara.

Pertimbangkan contoh ini:

cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // Output: 0
cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // Output: 1

Membingungkan, perbandingan terhadap 1 menghasilkan hasil yang berbeza bergantung pada susunan dalam yang mana nilai titik terapung ditambah. Mengapa ini berlaku?

Sifat Tidak Bersekutu Penambahan Titik Terapung

Penyebab di sebalik tingkah laku ini terletak pada sifat aritmetik titik terapung itu sendiri. Nombor titik terapung diwakili menggunakan bilangan bit terhingga, yang memperkenalkan ralat pusingan apabila operasi dilakukan. Ketaktepatan ini boleh nyata dalam penyimpangan daripada undang-undang persekutuan yang dijangkakan.

Seperti yang dijelaskan dalam kertas berwibawa "Apa Setiap Saintis Komputer Patut Tahu tentang Aritmetik Titik Terapung," peraturan praktikal berikut terpakai:

Contoh:

If x = 1e30, y = -1e30, and z = 1, then:

(x + y) + z = 1
x + (y + z) = 0

Implikasi untuk Pengaturcara

Memahami bukan kaitan penambahan titik terapung adalah penting untuk pengaturcaraan yang tepat. Untuk mengelakkan hasil yang tidak dijangka, pengaturcara harus mematuhi garis panduan berikut:

  • Penggunaan kurungan eksplisit: Sentiasa gunakan kurungan untuk mentakrifkan susunan operasi secara eksplisit untuk pengiraan titik terapung.
  • Elakkan terlalu bergantung pada persekutuan: Jangan menganggap bahawa susunan penambahan atau pendaraban tidak penting untuk pembolehubah titik terapung.
  • Pertimbangkan algoritma khusus titik terapung: Menyiasat algoritma yang direka khusus untuk terapung- aritmetik titik yang menyumbang kepada isu ketepatan yang berpotensi.

Dengan mematuhi ini garis panduan, pengaturcara boleh mengurangkan kesan pengehadan persekutuan dalam aritmetik titik terapung dan memastikan tingkah laku program yang tepat dan boleh diramal.

Atas ialah kandungan terperinci Mengapa Penambahan Titik Terapung Tidak Sentiasa Mengikut Undang-undang Bersekutu?. 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