看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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