Re: [問題] Do while迴圈
※ 引述《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
03/23 15:58, 1F
→
03/23 15:59, , 2F
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
03/24 01:41, 4F
推
03/24 01:59, , 5F
03/24 01:59, 5F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章