Integer Math dengan std::pow() Menghasilkan Keputusan Salah
Dalam coretan kod yang disediakan:
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl;
output yang dijangkakan hendaklah "123" tetapi sebaliknya, "122" ialah dicetak.
Sebab Output Salah
Isunya terletak pada penggunaan std::pow(). Fungsi ini direka bentuk untuk berfungsi dengan nombor titik terapung, yang tidak mempunyai ketepatan yang tidak terhingga. Walaupun ini merupakan kelemahan pelaksanaan yang berpotensi dalam g 4.7.2 (MinGW, Windows XP), punca utama ialah ketepatan terhad pengiraan titik terapung.
Penyelesaian: Fungsi Kuasa Integer
Untuk menyelesaikan isu ini, fungsi kuasa integer boleh dilaksanakan untuk hasil yang tepat dengan integer. Dalam C 11 dan kemudian, fungsi ini boleh ditakrifkan sebagai constexpr, membenarkan ia berpotensi mengira hasil pada masa penyusunan jika boleh:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Borang Rekursif Ekor Alternatif
Fungsi ini juga boleh dilaksanakan dalam bentuk rekursif ekor, yang lebih cekap dalam beberapa keadaan:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Dengan menggunakan fungsi kuasa integer ini menggantikan std::pow(), kod akan menghasilkan output yang betul, "123", tanpa isu ketepatan yang dikaitkan dengan pengiraan titik terapung.
Atas ialah kandungan terperinci Mengapakah `std::pow()` Menghasilkan Keputusan yang Salah dengan Matematik Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!