Rumah >pembangunan bahagian belakang >C++ >Mengapa Aritmetik Titik Terapung dalam C Membawa kepada Isu Ketepatan?

Mengapa Aritmetik Titik Terapung dalam C Membawa kepada Isu Ketepatan?

DDD
DDDasal
2024-11-04 11:20:02939semak imbas

Why Does Floating-Point Arithmetic in C   Lead to Precision Issues?

Kepersisan Titik Terapung dalam C

Aritmetik titik terapung dalam C mempamerkan tingkah laku yang boleh bertentangan dengan intuitif. Pertimbangkan perkara berikut:

Ungkapan double a = 0.3; memberikan nilai yang secara logik mewakili 0.3 kepada pembolehubah a. Walau bagaimanapun, output std::cout << a << std::endl; dengan 20 tempat perpuluhan ketepatan menunjukkan "0.299999999999999889." Sisihan ini menunjukkan bahawa storan dalaman nombor titik terapung berbeza daripada nilai logiknya.

Begitu juga, dalam gelung yang a berulang kali ditambah kepada b, hasil pada penghujung gelung (50 lelaran) ialah "15.000000000000014211," yang lebih tinggi daripada yang sepatutnya. Hasil ini menunjukkan bagaimana ralat pembundaran boleh terkumpul dalam berbilang operasi.

Untuk memintas isu ketepatan ini, adalah penting untuk mengelak daripada menetapkan ketepatan nilai titik terapung lebih tinggi daripada ketepatan sebenar jenis data. Ini boleh dicapai menggunakan pendekatan berikut:

#include 
#include 

int main() {
    double a = 0.3;
    std::cout.precision(std::numeric_limits::digits10);
    std::cout << a << std::endl;

    double b = 0;
    for (char i = 1; i <= 50; i++) {
        b = b + a;
    }

    std::cout.precision(std::numeric_limits::digits10);
    std::cout << b << std::endl;
}

Dengan menetapkan ketepatan kepada ketepatan maksimum yang tersedia bagi jenis data berganda, output akan mewakili nilai yang disimpan dengan tepat. Walau bagaimanapun, jika gelung dijalankan untuk bilangan lelaran yang jauh lebih besar (cth., 5000 dan bukannya 50), ralat terkumpul masih akan menjadi ketara disebabkan oleh had sedia ada aritmetik titik terapung.

Atas ialah kandungan terperinci Mengapa Aritmetik Titik Terapung dalam C Membawa kepada Isu Ketepatan?. 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