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
Lepaskan: 2024-12-06 15:33:11
asal
513 orang telah melayarinya

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;
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan