Re: [問題] c++如何降低精準度

看板C_and_CPP作者 (pziyout)時間14年前 (2011/07/21 09:46), 編輯推噓0(005)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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

07/21 14:20, , 1F
一種是設定tolerence, 差距小於tolerence就視為相同
07/21 14:20, 1F

07/21 14:21, , 2F
或是你的運算不會牽涉到無理數的話,可以用有理數的資料結
07/21 14:21, 2F

07/21 14:21, , 3F
07/21 14:21, 3F

07/21 14:27, , 4F
類似的問題,我用的是mse,不加sqrt.
07/21 14:27, 4F

07/21 18:47, , 5F
complex template 不用嗎?
07/21 18:47, 5F
文章代碼(AID): #1E9uJu_3 (C_and_CPP)
文章代碼(AID): #1E9uJu_3 (C_and_CPP)