こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}
===================================================================

投稿日時 - 2008-05-29 22:32:35

QNo.4060737

困ってます

質問者が選んだベストアンサー

> たとえば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

となり、皆さんの回答の値と一致しますよね。
とすると、そもそもの想定か、式のどちらかがまちがっているのでは?

投稿日時 - 2008-05-30 11:11:37

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

掲載のソースをそのまま利用して試してみました。
----------
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
----------
の結果になりました。
コンパイラの設定や環境に依存した原因では?

投稿日時 - 2008-05-30 10:56:10

ANo.4

このプログラムを見ると、小数点以下6桁の表示を求めているのですが、そもそもfloat型では有効桁数が足りないと思います。

また浮動小数点数の誤差(丸め誤差)も考慮に入れた方がよいと思います。
誤差が誤差を呼び、初期入力値によっては全く有効精度の無い答えになると思います。

最初からdouble型を使った方が良いのでは?
今時わざわざfloat型を使うメリットはないと思いますが…

投稿日時 - 2008-05-30 10:03:51

ANo.3

ためしにコピペしてコンパイルしてみましたが、特に大きな問題もなく動いてるように見えますが・・・
唯一、X_0 = c = float k = 0 としたときは除いて。
# これは、0 では割れない、と言うルールがあるためです。
## 式中の変数名とプログラム中の変数名が一致してなくてアレアレ、と少し混乱。。

ゼロ除算以外でうまく動かない、と言うことであれば、#2で求められている補足をお願いします。
特に、入力値、期待結果、実行結果が欲しいです。

参考URL:http://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E9%99%A4%E7%AE%97

投稿日時 - 2008-05-30 01:38:02

補足

たとえば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
と表示されてほしいのに、べつの結果が表示されてしまいます。

投稿日時 - 2008-05-30 09:40:48

ANo.2

いやいやいやいや, そんなことはありえませんよ>#1. さすがに int と float がまざれば, 全て float で計算されますし最終結果も float になります.
この手の質問でよくあるんですが, 「うまく表示されない」といわれても普通の人には何がどのように「うまく表示されない」のか全く見当が付かないんですよ. せめて,
・どの処理系で
・どのように実行して
・どのような結果が期待されるところ
・どのようになったのか
くらいは書けませんか?

投稿日時 - 2008-05-30 01:01:01

補足

たとえば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
と表示されてほしいのに、べつの結果が表示されてしまいます。

投稿日時 - 2008-05-30 09:37:09

ANo.1

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.をご覧下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/detail/TypeConversion.html

投稿日時 - 2008-05-30 00:50:23

あなたにオススメの質問