Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::pow` Memberi Keputusan Tidak Dijangka dengan Matematik Integer?

Mengapakah `std::pow` Memberi Keputusan Tidak Dijangka dengan Matematik Integer?

Barbara Streisand
Barbara Streisandasal
2024-12-03 10:33:11124semak imbas

Why Does `std::pow` Give Unexpected Results with Integer Math?

Mengapa Matematik Integer dengan std::pow Menghasilkan Keputusan Yang Tidak Dijangka

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.

Pelaksanaan Fungsi Kuasa Integer

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);
}

Variasi Rekursif Ekor

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn