作者sjgau (sjgau)
看板C_and_CPP
標題Re: [問題] 關於C語言開根號
時間Tue Oct 12 15:24:24 2010
: 題目:要用逼近法將輸入之變數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:勘根就可以了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