- ベストアンサー
C言語 プログラミングで行詰まりました…
標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> たとえばi=1,j=3,k=5,n=5と入力すると > X_0=5.000000 > X_1=1.600000 そもそもの式の定義に従って手計算で計算すると、 X_0 = 5 X_1 = (1+3)/X_0 = 4/5 = 0.8 となり、皆さんの回答の値と一致しますよね。 とすると、そもそもの想定か、式のどちらかがまちがっているのでは?
その他の回答 (5)
- Silver-Bee
- ベストアンサー率28% (2/7)
掲載のソースをそのまま利用して試してみました。 ---------- i:1 j:3 k:5 n:5 X_0= 5.000000 X_1= 0.800000 X_2= 5.000000 X_3= 0.800000 X_4= 5.000000 X_5= 0.800000 ---------- の結果になりました。 コンパイラの設定や環境に依存した原因では?
- adbarg
- ベストアンサー率53% (1134/2108)
このプログラムを見ると、小数点以下6桁の表示を求めているのですが、そもそもfloat型では有効桁数が足りないと思います。 また浮動小数点数の誤差(丸め誤差)も考慮に入れた方がよいと思います。 誤差が誤差を呼び、初期入力値によっては全く有効精度の無い答えになると思います。 最初からdouble型を使った方が良いのでは? 今時わざわざfloat型を使うメリットはないと思いますが…
- _himajin_
- ベストアンサー率65% (128/195)
ためしにコピペしてコンパイルしてみましたが、特に大きな問題もなく動いてるように見えますが・・・ 唯一、X_0 = c = float k = 0 としたときは除いて。 # これは、0 では割れない、と言うルールがあるためです。 ## 式中の変数名とプログラム中の変数名が一致してなくてアレアレ、と少し混乱。。 ゼロ除算以外でうまく動かない、と言うことであれば、#2で求められている補足をお願いします。 特に、入力値、期待結果、実行結果が欲しいです。
- Tacosan
- ベストアンサー率23% (3656/15482)
いやいやいやいや, そんなことはありえませんよ>#1. さすがに int と float がまざれば, 全て float で計算されますし最終結果も float になります. この手の質問でよくあるんですが, 「うまく表示されない」といわれても普通の人には何がどのように「うまく表示されない」のか全く見当が付かないんですよ. せめて, ・どの処理系で ・どのように実行して ・どのような結果が期待されるところ ・どのようになったのか くらいは書けませんか?
補足
たとえばi=1,j=3,k=5,n=5と入力すると X_0=5.000000 X_1=1.600000 X_2=2.875000 X_3=2.043478 X_4=2.468085 X_5=2.215517 と表示されてほしいのに、べつの結果が表示されてしまいます。
- ojasve
- ベストアンサー率20% (96/469)
Cの文法は忘れてしまいましたが intをFloatで割ると、まず、intになって、その後floatに代入しても、小数点以下が切り捨てられてしまうから、誤差が出るのでしょう。 (たしか) つまり float f_X(int a,int b,float c) の中で y=(a+b)/c; に問題があります。 例えば、y=((float)a+(float)b)/c; としてみてください。 return y; } 参考URLの4.をご覧下さい。
補足
たとえばi=1,j=3,k=5,n=5と入力すると X_0=5.000000 X_1=1.600000 X_2=2.875000 X_3=2.043478 X_4=2.468085 X_5=2.215517 と表示されてほしいのに、べつの結果が表示されてしまいます。