透過一個簡單的C 範例了解浮點錯誤
在程式設計領域,浮點變數由於其有限的精確度可能會引入錯誤。這種現象稱為浮點錯誤,在執行涉及此類變數的數學運算時可能會出現。
考慮以下C 程式碼片段,它嘗試計算10 個獨立事件序列中恰好兩次成功的機率,其中每個事件都有成功的機率「p」:
double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
變數“pow()”和“choose()”表示數學函數。
現在,讓我們檢查一下這段程式碼是否面臨潛在的浮點錯誤。隨著上式中'k'的值增加,項'pow(1-p, k)'和'choose(k, 2)'的量級將變得非常大。這可能會導致浮點錯誤累積,因為這些運算是在越來越大的數字上執行的。
為了形象化這一點,讓我們繪製方程式「f(k)」:
f(k) = pow(1-p, k) * pow(p, k) * choose(k, 2)
其中「X」和「Y」都採用對數刻度。
對於具有 32 位元浮點表示的計算機,我們預期對於「k」的所有值,「f(k)」為零。然而,由於浮點誤差,「k」值越大,誤差就會顯著增加。從下圖可以看出這一點:
[具有對數刻度的XY 圖圖像]
在此圖中,X 軸代表“k”,Y 軸代表誤差的絕對值。隨著「k」的增加,誤差累積變得更加明顯。
因此,由於機率計算中捨入誤差的累積,所提供的程式碼片段確實容易受到浮點錯誤的影響。
以上是為什麼我的 C 機率計算會出現浮點錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!