Memahami Isu Ketepatan dalam Matematik Integer dengan std::pow
Apabila melakukan operasi aritmetik integer dengan std::pow(), pengaturcara boleh menemui hasil yang tidak dijangka. Ini kerana std::pow() secara asalnya berfungsi dengan nombor titik terapung, yang memperkenalkan potensi isu disebabkan ketepatan terhingga.
Pertimbangkan contoh berikut:
#include <iostream> #include <cmath> int main() { int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl; }
Kod ini cuba mengira nilai i sebagai 23 1 * 10^2. Walau bagaimanapun, output ialah "122" dan bukannya "123" yang dijangkakan. Ini kerana std::pow() beroperasi pada nombor titik terapung, yang mungkin mengakibatkan ketidaktepatan kecil dalam hasil yang dikira.
Untuk menyelesaikan isu ini, adalah lebih baik untuk menggunakan fungsi pow khusus integer yang memastikan pengiraan berasaskan integer yang tepat. Satu cara untuk mencapai ini ialah dengan mencipta fungsi pow tersuai yang melakukan pendaraban integer secara rekursif:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Fungsi tersuai ini memastikan pengiraan integer yang tepat tanpa potensi isu ketepatan yang dikaitkan dengan aritmetik titik terapung.
Atas ialah kandungan terperinci Mengapakah std::pow() Menghasilkan Keputusan Yang Tidak Dijangka dalam Aritmetik Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!