Kepersisan Titik Terapung dalam C
Aritmetik titik terapung dalam C mempamerkan tingkah laku yang boleh bertentangan dengan intuitif. Pertimbangkan perkara berikut:
Ungkapan double a = 0.3; memberikan nilai yang secara logik mewakili 0.3 kepada pembolehubah a. Walau bagaimanapun, output std::cout << a << std::endl; dengan 20 tempat perpuluhan ketepatan menunjukkan "0.299999999999999889." Sisihan ini menunjukkan bahawa storan dalaman nombor titik terapung berbeza daripada nilai logiknya.
Begitu juga, dalam gelung yang a berulang kali ditambah kepada b, hasil pada penghujung gelung (50 lelaran) ialah "15.000000000000014211," yang lebih tinggi daripada yang sepatutnya. Hasil ini menunjukkan bagaimana ralat pembundaran boleh terkumpul dalam berbilang operasi.
Untuk memintas isu ketepatan ini, adalah penting untuk mengelak daripada menetapkan ketepatan nilai titik terapung lebih tinggi daripada ketepatan sebenar jenis data. Ini boleh dicapai menggunakan pendekatan berikut:
#include
#include
int main() {
double a = 0.3;
std::cout.precision(std::numeric_limits::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::digits10);
std::cout << b << std::endl;
}
Dengan menetapkan ketepatan kepada ketepatan maksimum yang tersedia bagi jenis data berganda, output akan mewakili nilai yang disimpan dengan tepat. Walau bagaimanapun, jika gelung dijalankan untuk bilangan lelaran yang jauh lebih besar (cth., 5000 dan bukannya 50), ralat terkumpul masih akan menjadi ketara disebabkan oleh had sedia ada aritmetik titik terapung.
Atas ialah kandungan terperinci Mengapa Aritmetik Titik Terapung dalam C Membawa kepada Isu Ketepatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!