Ketepatan Titik Terapung dalam C
Dalam C, nombor titik terapung adalah tepat sehingga bilangan tempat perpuluhan tertentu. Walau bagaimanapun, terdapat had pada ketepatan ini, yang boleh membawa kepada hasil yang tidak dijangka.
Pernyataan Masalah
Pertimbangkan coretan kod berikut:
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; // Print 0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; // Print 15.000000000000014211
Seperti yang digambarkan, a kurang sedikit daripada 0.3, tetapi apabila didarab dengan 50, b menjadi lebih besar sedikit daripada 15.0. Sisihan daripada hasil yang dijangkakan ini boleh dikaitkan dengan had ketepatan titik terapung.
Penyelesaian
Untuk mendapatkan keputusan yang betul, adalah penting untuk mengelakkan daripada menetapkan ketepatan lebih tinggi daripada ketepatan yang tersedia untuk jenis angka. Coretan kod yang disemak berikut menunjukkan pendekatan ini:
<code class="cpp">#include <iostream> #include <limits> int main() { double a = 0.3; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << a << std::endl; double b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << b << std::endl; }</code>
Pendekatan ini memastikan ketepatan ditetapkan kepada maksimum yang tersedia untuk jenis data berganda. Adalah penting untuk ambil perhatian bahawa jika gelung dijalankan untuk bilangan lelaran yang jauh lebih besar, seperti 5000 dan bukannya 50, ralat terkumpul akhirnya akan menjadi ketara, tanpa mengira tetapan ketepatan. Ini adalah had semula jadi aritmetik titik terapung.
Atas ialah kandungan terperinci Mengapa Aritmetik Titik Terapung dalam C Membawa kepada Ralat Ketepatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!