OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

γ関数のプログラム(初心者です)

  • すぐに回答を!
  • 質問No.243052
  • 閲覧数231
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 60% (14/23)

以下のようにγ関数のプログラムを組みました。
とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。
もとはfortranで組んだプログラムをCに置き換えました。
ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。
ですからサブルーチンファイル(ユーザー関数?)として利用できません。
何がいけないのでしょうか?
正しくyが帰ってくるようにどうなおしたらよいのか教えてください。








#include <stdio.h>
#include <math.h>

double gamma(double x)
{
double c[8],y,a,r,b,s;
int i;
a=1.;
r=1.;

c[1]=5.771916e-01;
c[2]=9.882058e-01;
c[3]=8.970569e-01;
c[4]=9.182068e-01;
c[5]=7.567040e-01;
c[6]=4.821993e-01;
c[7]=1.935278e-01;
c[8]=3.586834e-02;


printf("0 %f\n",x);

while(1){
if(x>2.){
x=x-1.;
a=a*x;
printf("1 %f %f\n",x,a);
}
else if(x<1.){
a=a/x;
x=x+1.;
printf("2 %f %f\n",x,a);
}
else{
break;
}
}
x=x-1.;
for(i=1;i<8;i++){
b=(double)(i);
s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b))));
printf("3 %d %f\n",i,c[i]);
r=r+s;
}
y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8)))));
printf("4 %f\n",y);
return y;
}

main()
{
double x,y;
printf("数字を入力してください。");
scanf("%lf",&x);
printf("メインプログラム %lf\n",x);
y=gamma(x);
printf("%f\n",y);
}
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル8

ベストアンサー率 51% (21/41)

>double c[8],y,a,r,b,s;

double c[9],y,a,r,b,s;
にするか
>c[1]=5.771916e-01;
>c[2]=9.882058e-01;
>c[3]=8.970569e-01;
>c[4]=9.182068e-01;
>c[5]=7.567040e-01;
>c[6]=4.821993e-01;
>c[7]=1.935278e-01;
>c[8]=3.586834e-02;
c[0]=5.771916e-01;
c[1]=9.882058e-01;
c[2]=8.970569e-01;
c[3]=9.182068e-01;
c[4]=7.567040e-01;
c[5]=4.821993e-01;
c[6]=1.935278e-01;
c[7]=3.586834e-02;
にしてみれば

c[8]のとき添え字は0-7だよ
お礼コメント
acac

お礼率 60% (14/23)

おっしゃった通りなおしてみたら、Segmentation Faultは解消しました。
…ですが、4で確認できる値と(これは正しい値)メイン文で出力される値(変な値)が異なってしましました。
関数側の値がちゃんと出力されるためにはどうしたらいいんですか??
もし、よかったらお願いします。
投稿日時 - 2002-03-28 20:19:06
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

4で値を確認できた後のセグメンテーションフォールトといったら ここしかないのでは。 printf("%f\n",y);   ↓ printf("%lf\n",y); ...続きを読む
4で値を確認できた後のセグメンテーションフォールトといったら
ここしかないのでは。
printf("%f\n",y);
  ↓
printf("%lf\n",y);
お礼コメント
acac

お礼率 60% (14/23)

どうもこれではなおらないようでした。
アドバイスありがとうございました。
投稿日時 - 2002-03-28 22:43:39


  • 回答No.3
レベル8

ベストアンサー率 36% (18/50)

関数の中では printf("4 %lf\n",y); %lfとしていて、 メイン関数では print("%f\n",y); とかにしていませんか? 出力の型が違うのではないかと…。現在のソースを見ていないのでなんとも言えませんが…。 ...続きを読む
関数の中では

printf("4 %lf\n",y);

%lfとしていて、

メイン関数では

print("%f\n",y);

とかにしていませんか?
出力の型が違うのではないかと…。現在のソースを見ていないのでなんとも言えませんが…。
お礼コメント
acac

お礼率 60% (14/23)

確かめてみましたが、大丈夫でした。
現在のソースファイルは、先ほどの方がおっしゃってくださったアドバイスどおり配列の数を直しただけです。
良かったら、またアドバイスください。
ありがとうございます。
投稿日時 - 2002-03-28 22:42:25
  • 回答No.4
レベル14

ベストアンサー率 50% (1122/2211)

質問で提示されたソースがアルゴリズムとしてはほぼあっている、という前提で 元のソースを見直してみました。 # というのも、手持ちのΓ関数算出のプログラムと結果が違うんで :-) Segmentation Fault の原因は nakashi さんが書かれている通り、C 言語の配列は 添え字が0から始まる、ということです。 それを直すには、nakashi さんが書かれているだけでは ...続きを読む
質問で提示されたソースがアルゴリズムとしてはほぼあっている、という前提で
元のソースを見直してみました。

# というのも、手持ちのΓ関数算出のプログラムと結果が違うんで :-)


Segmentation Fault の原因は nakashi さんが書かれている通り、C 言語の配列は
添え字が0から始まる、ということです。

それを直すには、nakashi さんが書かれているだけでは、ちょっと足りません。
以下に見直してみたソースを載せておきます。

コメントで /* ※ */ が入っているところが変更点です。一ヶ所を除いて、添え字の
見直しをしただけです。


double gamma(double x)
{
double c[8],y,a,r,b,s;
int i;
a=1.;
r=1.;

c[0]=5.771916e-01; /* ※ */
c[1]=9.882058e-01; /* ※ */
c[2]=8.970569e-01; /* ※ */
c[3]=9.182068e-01; /* ※ */
c[4]=7.567040e-01; /* ※ */
c[5]=4.821993e-01; /* ※ */
c[6]=1.935278e-01; /* ※ */
c[7]=3.586834e-02; /* ※ */


printf("0 %f\n",x);

while(1){
if(x>2.){
x=x-1.;
a=a*x;
printf("1 %f %f\n",x,a);
}
else if(x<1.){
a=a/x;
x=x+1.;
printf("2 %f %f\n",x,a);
}
else{
break;
}
}
x=x-1.;
for(i=0;i<8;i++){ /* ※ 8回のループで良いですよね? */
b=(double)(i+1); /* ※ */
s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b))));
printf("3 %d %f\n",i+1,c[i]); /* ※ */
r=r+s;
}
y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8)))));
printf("4 %f\n",y);
return y;
}
お礼コメント
acac

お礼率 60% (14/23)

アドバイスありがとうございます。
配列にかんしては、問題解消しました。
Segmentation faultも出ません。
ですが、正しい値がメインの出力にかえってきません。
関数の中では4で正しい値が確認できるのに、メイン文の出力では全然関係ない数字がでてしまいます。
これは、どうやったら治るのか良かったらまたアドバイスください。
投稿日時 - 2002-03-29 17:46:46
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ