C言語関係掲示板

過去ログ

No.208.プログラムの障害


No.1294

私の障害も教えてください。
投稿者---たろー(2002/03/19 21:06:22)


double f (double a, double b)
{
double x, y, d=1.0e-10;
for( y=0.0, x=a; x=b; x=x+d )
{
double y;
y=y+d*pow(x, 5.0)*exp(-1.0*x);
}
return(y);
}

これを使うとどんな障害が出るのか、
わかる人教えていただけませんか??
よろしくお願いします。

No.1295

Re:私の障害も教えてください。
投稿者---ともじ(2002/03/20 00:29:04)


こんばんは。

>double f (double a, double b)
>{
> double x, y, d=1.0e-10;
> for( y=0.0, x=a; x=b; x=x+d )
> {
> double y;
> y=y+d*pow(x, 5.0)*exp(-1.0*x);
> }
> return(y);
>}
>
>これを使うとどんな障害が出るのか、
>わかる人教えていただけませんか??

とりあえず、for( y=0.0, x=a; x<=b; x=x+d ) だとは思いますが。
この問題は課題でしょうか。非常に嫌らしいですね。

(1) まず、ループの前と中で、double y;を宣言していますが、
  これは実体の異なるyという変数が2つ取られることになります。
  色を付けて示すと、
  double f (double a, double b)
  {
      double x, y, d=1.0e-10;
      for( y=0.0, x=a; x&lt;=b; x=x+d )
      {
          double y=0.0;
          y=y+d*pow(x, 5.0)*exp(-1.0*x);
      }
      return(y);
  }
  となり、このyyは別物のyになります。
  ですから、ループの中で求めたyは返却されないことになります。
  なお、ループ中のyですが、これは初期化が必要ですので、
  0.0で初期化するようにしました。

(2) 次に、d=1.0e-10;は大変に小さな値で、引数のa,bにある程度の大きさ
  の値を設定すると、ループの増分は「x=x+d」であるため、大変な
  回数ループを回ることになり、処理に時間がかかってしまいます。

(3) それから、y=y+d*pow(x, 5.0)*exp(-1.0*x); ですが、
  xの5乗、指数関数eのx乗、d(1.0e-10)をそれぞれ掛けますので、
  (2)で処理時間かあまりかからないように小さめの値を設定すると
  今度はアンダーフローが起こり、値が求められなくなってしまいます。

たぶん、こんなところだとは思いますが、他にもあるかもしれません。
  




戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved