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

Mengapakah Matematik Integer dengan `pow()` Menghasilkan Keputusan yang Salah dalam C ?

DDD
DDDasal
2024-12-04 22:58:11745semak imbas

Why Does Integer Math with `pow()` Produce Incorrect Results in C  ?

Integer Math dengan pow() Membawa Kepada Keputusan Yang Salah

Pertimbangkan coretan kod berikut:

int i = 23;
int j = 1;
int base = 10;
int k = 2;
i += j * pow(base, k);
cout << i << endl;

Dijangka , kod ini sepatutnya mengeluarkan "123," tetapi sebaliknya, ia secara mengejutkan mencetak "122." Keputusan yang tidak dijangka ini mungkin membingungkan anda, terutamanya jika anda menyusun dengan g 4.7.2 dalam persekitaran Windows XP.

Inti percanggahan ini ialah hakikat bahawa std::pow() direka untuk mengendalikan nombor titik terapung. Walaupun nombor titik terapung ini menawarkan kemudahan, ia datang dengan pertukaran: ketepatan terhad. Dalam kes std::pow(), pelaksanaan mungkin tidak mengendalikan eksponen dengan ketepatan yang sempurna, yang membawa kepada ralat pembundaran.

Untuk menangani isu ini, seseorang boleh memanfaatkan kuasa C 11 dan menentukan integer mereka sendiri fungsi eksponen:

constexpr int int_pow(int b, int e) {
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}

Fungsi int_pow tersuai ini disesuaikan khusus untuk integer, memastikan ketepatan keputusan.

Sebagai alternatif, pendekatan rekursif ekor yang dicadangkan oleh Dan Nissenbaum juga merupakan penyelesaian yang berdaya maju:

constexpr int int_pow(int b, int e, int res = 1) {
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}

Dengan pilihan ini, anda kini boleh menggunakan eksponen integer dengan yakin dalam C anda program, membuang hasil yang salah ke alam pepijat yang dilupakan.

Atas ialah kandungan terperinci Mengapakah Matematik Integer dengan `pow()` Menghasilkan Keputusan yang Salah dalam C ?. 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