Apabila menggunakan std::pow untuk matematik integer, anda mungkin menghadapi output yang tidak dijangka. Dalam senario ini, coretan kod yang bertujuan untuk menetapkan i = 23 1 * 10^2 menghasilkan 122, bukan 123.
Tingkah laku ini berpunca daripada sifat titik terapung std::pow, yang sememangnya kekurangan infiniti ketepatan. Pelaksanaan mungkin memburukkan lagi isu ini melalui pelaksanaan yang tidak cekap.
Untuk menangani perkara ini, fungsi kuasa integer tersuai boleh ditakrifkan. Dalam C 11 dan kemudian, fungsi constexpr memastikan bahawa hasilnya boleh dikira pada masa penyusunan:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Borang rekursif ekor alternatif, dikaitkan dengan Dan Nissenbaum, membolehkan pengiraan yang lebih cekap:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Alternatif ini memberikan yang tepat pengiraan kuasa integer, menyelesaikan isu yang dihadapi dengan std::pow.
Atas ialah kandungan terperinci Mengapakah `std::pow` Memberi Keputusan Tidak Dijangka dengan Matematik Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!