Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::pow()` Menghasilkan Keputusan yang Salah dengan Matematik Integer?

Mengapakah `std::pow()` Menghasilkan Keputusan yang Salah dengan Matematik Integer?

Linda Hamilton
Linda Hamiltonasal
2024-12-26 19:11:10472semak imbas

Why Does `std::pow()` Produce Incorrect Results with Integer Math?

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!

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