作者pziyout (pziyout)
看板C_and_CPP
標題Re: [問題] c++如何降低精準度
時間Thu Jul 21 09:46:30 2011
※ 引述《yuchiao0921 (挑戰在我就在)》之銘言:
: 我想讓123.754645 和123.754689變成一樣大有什麼方法?
: 因為我在做ACM11001有一個地方是要判斷2數是否相等
: 用uvatoolkit測試發現它好像都會把很接近的數視為一樣
: 請問有什麼方法能降低精準度?
: 試過setprecision
: 但是setprecision好像只有對output有用
將問題擴充一下,
做數值運算時,常常要判斷兩個座標點是否一樣,但由於
計算上難免會有發生截去誤差,因此在數學上兩個明明是
一樣的座標點經過計算後就變成不一樣。例如:
struct Point {
double x , y ;
Point(double a=0 ,double b=0) : x(a) ,y(b) {}
};
Point pt1(1,1) , pt2 ;
若將 pt1 連八次旋轉 45 度後存入 pt2,則在數學上 pt2 的座標
應與 pt1 同點,但計算上則不同。這時處理的方式就是針對 Point
定義 operator==
bool operator== ( const Point& pt1 , const Point& pt2 ) {
double dx = pt1.x-pt2.x ;
double dy = pt2.y-pt2.y ;
return ( sqrt( dx*dx + dy*dy ) <= TOL ? true : false ) ;
}
bool operator!= ( const Point& pt1 , const Point& pt2 ) {
return ! ( pt1 == pt2 ) ;
}
以上的 TOL 可根據問題的差異自行設定大小。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.25.24
→ Wush978:一種是設定tolerence, 差距小於tolerence就視為相同 07/21 14:20
→ Wush978:或是你的運算不會牽涉到無理數的話,可以用有理數的資料結 07/21 14:21
→ Wush978:構 07/21 14:21
→ tropical72:類似的問題,我用的是mse,不加sqrt. 07/21 14:27
→ firejox:complex template 不用嗎? 07/21 18:47