佔位元組數
數值範圍
十進位制精度位數
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...