Ketepatan Titik Terapung dan Pemangkasan dalam C
Dalam C , fungsi pow mengambil dua nilai titik terapung berketepatan ganda sebagai input dan mengembalikan hasil titik terapung berketepatan dua kali. Walau bagaimanapun, apabila berurusan dengan nilai eksponen yang besar, ketepatan titik terapung boleh membawa kepada hasil yang tidak dijangka.
Masalah dengan pow(10,5)
Pertimbangkan perkara berikut kod:
const int sections = 10; for (int t = 0; t < 5; t++) { int i = pow(sections, 5 - t - 1); cout << i << endl; }
Output yang dijangkakan untuk kod ini ialah:
10000 1000 100 10 1
Walau bagaimanapun, apabila anda menjalankan kod, anda mungkin menghadapi output yang salah:
9999 1000 99 10 1
Memahami Isu
Percanggahan ini timbul disebabkan oleh had ketepatan titik terapung. Dalam C , nilai titik terapung berketepatan dua mempunyai bilangan digit bererti yang terhad (kira-kira 15-17 digit perpuluhan). Apabila pow(10,5) dikira, hasilnya ialah nilai titik terapung yang besar (100000.0). Walau bagaimanapun, apabila anda memberikan nilai ini kepada pembolehubah integer (seperti i), bahagian pecahan dipotong. Oleh itu, nilai i menjadi 9999 dan bukannya 10000.
Mengelakkan Isu Ketepatan
Untuk mengelakkan isu ketepatan tersebut, anda boleh menggunakan pow(10.0, 5) secara terus dalam pernyataan cout, yang dinilai sebagai nilai titik terapung berketepatan dua dan dibundarkan apabila dicetak:
for (int t = 0; t < 5; t++) { cout << pow(sections, 5-t-1) << endl; }
Kod ini akan menghasilkan output yang betul:
10000.000000 1000.000000 100.000000 10.000000 1.000000
Atas ialah kandungan terperinci Bagaimanakah Ketepatan Titik Terapung Mempengaruhi Keputusan Integer Apabila Menggunakan Fungsi C `pow`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!