浮點數計算務必考慮浮點表示誤差並使用epsilon

2021-08-20 11:21:23 字數 624 閱讀 9492

對於浮點數的計算非常容易產生懶惰的想法而試圖忽視掉浮點表示的缺陷。最簡單的例子是浮點表示某些數值會有誤差,這個時候必須考慮使用epsilon。比如我要比較abs(a/b - c/d)的最小值,如果數值一樣就取字典最小序。如下版本是有問題的:

double ans = abs(elements[v[0]] * 1.0 / elements[v[1]] - elements[v[2]] * 1.0 / elements[v[3]]);

if (ans < bestans)

比如abs(9995/10000 - 9994/10000)的結果就大於abs(9995/10000 - 9996/10000)的結果,雖然它們的結果本來是一樣的。這時必須記住要使用epsilon來避免這樣的問題:

double ans = abs(elements[v[0]] * 1.0 / elements[v[1]] - elements[v[2]] * 1.0 / elements[v[3]]);

if (bestans - ans > std::numeric_limits::epsilon())

浮點數還經常容易出的問題是數值很大時同樣會丟掉小數值部分的精度。這個問題就更麻煩一些,以後再整理。

浮點數的表示

在定點數表示中存在的乙個問題是,難以表示數值很大的資料和數值很小的資料。例如,電子的質量 9 10 28克 和太陽的質量 2 1033克 相差甚遠,在定點計算機中無法直接表示,因為小數點只能固定在某乙個位置上,從而限制了資料的表示範圍。為了表示更大範圍的資料,數學上通常採用科學計數法,把資料表示成乙...

浮點數的表示

日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...

浮點數表示

之前的一些工作當中碰到了很多有關浮點數的問題,比如浮點數的表達範圍 表達精度 浮點數的儲存方式 浮點數的強制型別轉換等等,因此感覺有必要系統了解一下有關浮點數的問題。浮點數是一種公式化的表達方式,用來近似表示實數,並且可以在表達範圍和表示精度之間進行權衡 因此被稱為浮點數 浮點數通常被表示為 n m...