Re: [問題] Do while迴圈

看板C_and_CPP (C/C++)作者 (朴髮箍)時間15年前 (2011/03/23 15:31), 編輯推噓4(401)
留言5則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《psychic (過路人)》之銘言: : 程式碼(Code):(請善用置底文網頁, 記得排版) : ans11=ans1+1; : do { : z=(ans1+ans11)/2; : y1= : (ans1*ans1*ans1*ans1)-(9*ans1*ans1*ans1)-(2*ans1*ans1)+(120*ans1)-(130); : y2= : (ans11*ans11*ans11*ans11)-(9*ans11*ans11*ans11)-(2*ans11*ans11)+(120*ans11)-(130); : y3= (z*z*z*z)-(9*z*z*z)-(2*z*z)+(120*z)-(130); : if (y1*y3<0) { : ans11=(ans1+z)/2; : } : else if (y2*y3<0){ : ans1=(z+ans11)/2; : } : }while((ans11-ans1)<0.001); : 補充說明(Supplement): : 他搞了我兩個多小時我還是找不到BUG .... 我的看法跟推文中 x大提到的一樣, 「你跳太快了」, 我把變數做 個簡單的重命名一下... // 要逼根的區間 right = left + 1; do { // 區間中間值, 此點把逼根區間割成兩半 mid = (left + right)/2; // 取得左中右點帶入函式的函數值 left_y = pow(left,4)-9*pow(left,3)-2*pow(left,2)+120*left-130; mid_y = pow(mid,4)-9*pow(mid,3)-2*pow(mid,2)+120*mid-130; right_y = pow(right,4)-9*pow(right,3)-2*pow(right,2)+120*right-130; // 假如根在左半區間, 右邊界往左移 if ( left_y*mid_y < 0 ) { right = (left + mid)/2; } // 假如根在右半區間, 左邊界右移 else if ( right_y*mid_y < 0 ){ left = (mid + right)/2; } } while( (right-left)<0.001 ); 下面是逼根區間被分割的情形: left mid right ├────────────┼────────────┤ 假如根在左半區間, 會變成下面這樣: right left ↓ ├────────────┼────────────┤ 同理如果根在右半區間, 變成這樣: left ↓ right ├────────────┼────────────┤ 很不幸的如果你的根是在紅色的區塊裡, 最後算出來就不會是正確 結果, 我猜也因為是這個原因, 讓你選擇使用 if-else if 而不是 單純的if-else. 我的修改方式如下: 1.把 if-else 的地方改成 // 假如根在左半區間, 右邊界往左移 if ( left_y*mid_y < 0 ) { right = mid; } // 假如根在右半區間, 左邊界右移 else { left = mid; } 根在左半區間: right left ↓ ├────────────┼────────────┤ 根在右半區間: left ↓ right ├────────────┼────────────┤ 2.do-while 的測試條件改成 do { //... } while( (right-left) > 0.001 ); 重複堪根直到逼根的區間小於等於 0.001 為止, 你可以保證: right 絕對大於 left 完成. 為什麼找錯那麼久呢? 「因為你把程式碼檔案當做計算紙, 而不是稿紙」 -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

03/23 15:58, , 1F
我知道誤會在哪了,我是寫 ans = func(low),判斷是用
03/23 15:58, 1F

03/23 15:59, , 2F
fabs(ans) >= EPS; 所以的確您的不用abs..
03/23 15:59, 2F
逼的方式不一樣 :) ※ 編輯: loveme00835 來自: 140.121.197.115 (03/23 16:00)

03/23 16:56, , 3F
我看起來更像一塊綠豆糕
03/23 16:56, 3F

03/24 01:41, , 4F
樓上l大有梗....XD
03/24 01:41, 4F

03/24 01:59, , 5F
認真給推@@
03/24 01:59, 5F
文章代碼(AID): #1DYQ6rUS (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
7
18
完整討論串 (本文為第 2 之 2 篇):
7
18
文章代碼(AID): #1DYQ6rUS (C_and_CPP)