Ketepatan Titik Terapung dalam C
Aritmetik titik terapung dalam pengaturcaraan melibatkan mewakili nombor nyata menggunakan bilangan bit tetap, yang membawa kepada potensi ketidaktepatan . Artikel ini menangani isu ketepatan dalam operasi titik terapung C, dicontohkan oleh kod berikut:
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl;
Kod ini mengeluarkan 0.2999999999999999889 dan bukannya 0.3 yang dijangkakan. Selain itu, jika a ditambah pada dirinya sendiri 50 kali, hasilnya menjadi 15.0000000000000014211 dan bukannya 15 yang dijangkakan.
Penjelasan
Nombor titik terapung mempunyai ketepatan terhad, ditentukan oleh kiraan bit mereka. Terapung berketepatan dua kali mempunyai 53 bit untuk bahagian pecahan, menghasilkan ketepatan berkesan kira-kira 15 digit perpuluhan.
Apabila menggunakan std::cout.precision(20), anda mengarahkan strim untuk memaparkan 20 digit ketepatan. Walau bagaimanapun, nilai asas a hanya mempunyai 15 digit ketepatan. Digit tambahan diisi dengan sifar, membawa kepada ketidaktepatan.
Contoh kedua mengumpul ketidaktepatan penambahan berulang. Oleh kerana aritmetik titik terapung tidak bersekutu, jujukan penambahan yang sedikit berbeza boleh menghasilkan hasil yang sedikit berbeza.
Penyelesaian
Untuk meminimumkan kehilangan ketepatan, jangan tetapkan std:: cout.ketepatan lebih tinggi daripada ketepatan yang ada bagi jenis angka. Ini boleh dicapai menggunakan:
<code class="cpp">std::cout.precision(std::numeric_limits<double>::digits10);</code>
Ini mengehadkan ketepatan kepada 15 digit untuk terapung ketepatan dua kali.
Walau bagaimanapun, untuk bilangan pengiraan berulang yang banyak, ralat terkumpul mungkin masih berlaku. Dalam kes sedemikian, teknik alternatif, seperti aritmetik titik tetap atau menggunakan pecahan dengan pengangka dan penyebut integer, disyorkan.
Atas ialah kandungan terperinci Mengapakah `0.3` Menjadi `0.2999999999999999889` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!