Integer Math dengan pow() Membawa Kepada Keputusan Yang Salah
Pertimbangkan coretan kod berikut:
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); cout << i << endl;
Dijangka , kod ini sepatutnya mengeluarkan "123," tetapi sebaliknya, ia secara mengejutkan mencetak "122." Keputusan yang tidak dijangka ini mungkin membingungkan anda, terutamanya jika anda menyusun dengan g 4.7.2 dalam persekitaran Windows XP.
Inti percanggahan ini ialah hakikat bahawa std::pow() direka untuk mengendalikan nombor titik terapung. Walaupun nombor titik terapung ini menawarkan kemudahan, ia datang dengan pertukaran: ketepatan terhad. Dalam kes std::pow(), pelaksanaan mungkin tidak mengendalikan eksponen dengan ketepatan yang sempurna, yang membawa kepada ralat pembundaran.
Untuk menangani isu ini, seseorang boleh memanfaatkan kuasa C 11 dan menentukan integer mereka sendiri fungsi eksponen:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Fungsi int_pow tersuai ini disesuaikan khusus untuk integer, memastikan ketepatan keputusan.
Sebagai alternatif, pendekatan rekursif ekor yang dicadangkan oleh Dan Nissenbaum juga merupakan penyelesaian yang berdaya maju:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Dengan pilihan ini, anda kini boleh menggunakan eksponen integer dengan yakin dalam C anda program, membuang hasil yang salah ke alam pepijat yang dilupakan.
Atas ialah kandungan terperinci Mengapakah Matematik Integer dengan `pow()` Menghasilkan Keputusan yang Salah dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!