Memahami Ralat Titik Terapung Melalui Contoh C Mudah
Dalam bidang pengaturcaraan, pembolehubah titik terapung boleh memperkenalkan ralat disebabkan ketepatan terhingganya . Fenomena ini, yang dikenali sebagai ralat titik terapung, boleh timbul apabila melakukan operasi matematik yang melibatkan pembolehubah sedemikian.
Pertimbangkan coretan kod C berikut, yang cuba mengira kebarangkalian tepat dua kejayaan dalam urutan 10 peristiwa bebas, di mana setiap peristiwa mempunyai kebarangkalian 'p' kejayaan:
double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
Pembolehubah 'pow()' dan 'choose()' mewakili fungsi matematik.
Sekarang, mari kita periksa sama ada ini kod menghadapi kemungkinan ralat titik terapung. Apabila nilai 'k' dalam persamaan di atas meningkat, magnitud istilah 'pow(1-p, k)' dan 'pilih(k, 2)' akan menjadi sangat besar. Ini boleh membawa kepada pengumpulan ralat titik terapung, kerana operasi ini dilakukan pada nombor yang semakin besar.
Untuk memvisualisasikan ini, mari kita graf persamaan 'f(k)':
f(k) = pow(1-p, k) * pow(p, k) * choose(k, 2)
di mana kedua-dua 'X' dan 'Y' berada dalam skala logaritma.
Untuk komputer dengan perwakilan titik terapung 32-bit, kami menjangkakan 'f(k)' menjadi sifar untuk semua nilai 'k '. Walau bagaimanapun, disebabkan ralat titik terapung, ralat meningkat dengan ketara dengan nilai 'k' yang lebih besar. Ini jelas daripada graf yang ditunjukkan di bawah:
[Imej Graf XY dengan Skala Logaritma]
Dalam graf ini, paksi-X mewakili 'k', dan paksi-Y mewakili nilai mutlak ralat. Apabila 'k' meningkat, pengumpulan ralat menjadi lebih ketara.
Oleh itu, coretan kod yang disediakan sememangnya terdedah kepada ralat titik terapung disebabkan pengumpulan ralat pusingan dalam pengiraan kebarangkalian.
Atas ialah kandungan terperinci Mengapa Pengiraan Kebarangkalian C Saya Mengalami Ralat Titik Terapung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!