計算誤差 ACM計算幾何中的精度問題

2022-04-27 15:56:02 字數 1010 閱讀 2737

佔位元組數

數值範圍

十進位制精度位數

float

4-3.4e-38~3.4e38

6~7double

8-1.7e-308~1.7e308

14~15

如果記憶體不是很緊張或者精度要求不是很低,一般選用double。14位的精度(是有效數字位,不是小數點後的位數)通常夠用了。注意,問題來了,資料精度位數達到了14位,但有些浮點運算的結果精度並達不到這麼高,可能準確的結果只有10~12位左右。那低幾位呢?自然就是不可預料的數字了。這給我們帶來這樣的問題:即使是理論上相同的值,由於是經過不同的運算過程得到的,他們在低幾位有可能(一般來說都是)是不同的。這種現象看似沒太大的影響,卻會一種運算產生致命的影響: ==。恩,就是判斷相等。注意,c/c++中浮點數的==需要完全一樣才能返回true。來看下面這個例子:

#include #includeusing namespace std;

int main()

解決辦法,引進eps,輔助判斷浮點數相等

eps最常見的取值是1e-8左右。引入eps後我們判斷兩浮點數a,b相等的方式是:

定義三出口函式:int sgn(double a)

則各種判斷大小的運算都應做如下修改:

傳統意義

修正寫法1

修正寫法2

a==b

sgn(a-b) ==0

fabs(a -b) a!=b

sgn(a-b) !=0

fabs(a-b)>eps

asgn(a-b)<0

a-ba<=b

sgn(a-b)<=0

a-ba>b

sgn(a-b)>0

a-b>eps

a>=b

sgn(a-b)>=0

a-b>-eps

這樣才能把相差非常近的浮點數判為相等,相差較大的數判為不等。

ps:養成好習慣,盡量不要對浮點數用==判斷。修正寫法2中就沒有等號

數值計算誤差

在matlab上執行 5.1 5 0.1和 1.5 1 0.5,給出執行結果,並簡要分析一下產生現象的原因 x1 5.1 5 0.1 x1 3.608224830031759e 16 x2 1.5 1 0.5 x12 0原因 浮點數表示時數字時位數有限,以雙精度浮點數為例,共64位。對於5.1,符號...

ACM 計算幾何

1.找凸包的最小寬度 include using namespace std double eps 1e 10 考慮誤差的加法運算 double add double a,double b struct p p double x,double y x x y y p operator p p p o...

使用浮點型別導致計算誤差以及判斷誤差

1.計算誤差 浮點的精度是可變的,除非分數是2的整數冪次方,否者無法用有限的二進位制小數表示。即 0.1 分母為10,則分數應該是2的3次方至2的4次方之間,具體是多少我也算不出來了 即這個次方數會為乙個特別長的小數,在有限的長度中無法體現出來。則0.1會被表示為乙個十分接近0.1的值,如0.100...