Rumah >pembangunan bahagian belakang >C++ >Mengapakah std::pow() Menghasilkan Keputusan Yang Tidak Dijangka dalam Aritmetik Integer?

Mengapakah std::pow() Menghasilkan Keputusan Yang Tidak Dijangka dalam Aritmetik Integer?

Linda Hamilton
Linda Hamiltonasal
2024-12-06 15:33:11522semak imbas

Why Does std::pow() Produce Unexpected Results in Integer Arithmetic?

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!

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