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

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

Susan Sarandon
Susan Sarandonasal
2024-12-20 02:02:09418semak imbas

Why Doesn't Floating-Point Addition Always Follow the Associative Law?

Aritmetik Titik Terapung: Meneroka Persekutuan dalam Operasi Titik Terapung

Dalam bidang pengaturcaraan, nombor titik terapung adalah penting untuk berfungsi dengan nilai berterusan. Walau bagaimanapun, aritmetik titik terapung kadangkala boleh berkelakuan berbeza daripada matematik yang kami pelajari di sekolah, terutamanya apabila ia berkaitan dengan persekutuan.

Pertimbangkan contoh menambah tiga nilai titik terapung dan membandingkannya dengan 1:

cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // output is 0
cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // output is 1

Anehnya, kedua-dua ungkapan itu menghasilkan hasil yang berbeza. Percanggahan ini berpunca daripada fakta bahawa penambahan titik terapung tidak selalu bersekutu. Dalam erti kata lain, mengubah susunan kita menambah nilai boleh mengubah hasil akhir.

Fenomena tidak berpersatuan timbul disebabkan oleh pengehadan perwakilan titik terapung. Nombor titik terapung menggunakan format binari dengan bilangan bit terhingga, yang mengehadkan ketepatannya. Akibatnya, pengiraan dengan nombor titik terapung boleh memperkenalkan ralat pembundaran yang terkumpul sepanjang berbilang operasi.

Dalam contoh di atas, penambahan 0.7, 0.2 dan 0.1 menghasilkan nilai perantaraan yang sedikit berbeza bergantung pada susunan daripada operasi. Perbezaan kecil ini disebarkan melalui penambahan seterusnya, akhirnya membawa kepada keputusan akhir yang berbeza.

Untuk memahami konsep ini dengan lebih lanjut, mari kita pertimbangkan contoh daripada kertas mani David Goldberg "Apa Yang Setiap Ahli Sains Komputer Perlu Tahu tentang Aritmetik Titik Terapung":

(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0

Dalam kes ini, kurungan sangat mempengaruhi hasilnya. Menambah 1e30 dan -1e30 dalam kurungan menghasilkan nilai hampir sifar disebabkan pembundaran, yang kemudiannya ditambah kepada 1. Sebaliknya, menambah 1e30 dan hasil -1e30 1 menghasilkan nilai bukan sifar.

Oleh itu, apabila bekerja dengan aritmetik titik terapung, adalah penting untuk mengetahui potensi tidak berpersatuan dan berhati-hati apabila memanipulasi ungkapan yang melibatkan penambahan berulang atau operasi bersekutu lain.

Atas ialah kandungan terperinci Mengapa Penambahan Titik Terapung Tidak Sentiasa Mengikuti 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