看板 C_and_CPP 關於我們 聯絡資訊
: 題目:要用逼近法將輸入之變數Z開根號,找出一個Y使得Y*Y與Z的相差小於0.01 這個敘述有問題? 因為,誤差的考量,必須以 相對誤差為基準。 上述的 0.01 是相對誤差,還是絕對誤差, 沒有講清楚是 不行的。 如果是 絕對誤差,那麼 Z 的值,如果大於 10^14 的話, 也許 無法 求解。 所以,先把這個問題澄清一下吧 : 我是先用Z本身當起始,也就是令Y=Z, : 若相差大於0.01,且Y>=Z時,令Y=Y/2, : 若相差大於0.01,且Y<Z時,令Y=Y+(Z-Y)/2 : 希望得到的正確結果: : 如題目 : 程式跑出來的錯誤結果: : compiler沒有問題,但是跑不出結果。 : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : Dev-C++ : 有問題的code: (請善用置底文標色功能) : /*開根號運算*/ : #include<stdio.h> : #include<stdlib.h> : int main(void) : { : int z; : do : { : printf("輸入一個整數(1~1023):"); : scanf("%d",&z); : } : while(z<1||z>1023); : double a=z; : double b=z; : double x; : double y; : do : { : double c=b*b; : if(a<=c) : { : x=c-a; : if(b>=a) : { : y=b; : b=b/2; : } : else{ : y=b; : b=b+(a-b)/2;} : } : else { : x=a-c; : if(b>=a) : { : y=b; : b=b/2; : } : else{ : y=b; : b=b+(a-b)/2;} : } : } : while(x>0.01); : printf("%d開根號等於%f",z,y); : return 0; : } : 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.231.85.11
edd740404:對了,給定的範圍只有1~1023 10/12 15:26
xatier:http://nopaste.csie.org/7902a 範圍不大的話做很多次二分 10/12 17:59
xatier:勘根就可以了XD 10/12 17:59
edd740404:謝謝X大^^ 10/12 18:24
loveme00835:不知道是不是我自己對發文的門檻有點高, 看起來這幾句 10/12 18:27
loveme00835:可以直接用推的 10/12 18:27
concealment:這好像是數值方法裡面的問題!? 10/17 23:16