以下のようにγ関数のプログラムを組みました。
とりあえず整数値を入力すれば、正しい値は返しているということが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);
}
No.2ベストアンサー
- 回答日時:
>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だよ
おっしゃった通りなおしてみたら、Segmentation Faultは解消しました。
…ですが、4で確認できる値と(これは正しい値)メイン文で出力される値(変な値)が異なってしましました。
関数側の値がちゃんと出力されるためにはどうしたらいいんですか??
もし、よかったらお願いします。
No.4
- 回答日時:
質問で提示されたソースがアルゴリズムとしてはほぼあっている、という前提で
元のソースを見直してみました。
# というのも、手持ちのΓ関数算出のプログラムと結果が違うんで :-)
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;
}
アドバイスありがとうございます。
配列にかんしては、問題解消しました。
Segmentation faultも出ません。
ですが、正しい値がメインの出力にかえってきません。
関数の中では4で正しい値が確認できるのに、メイン文の出力では全然関係ない数字がでてしまいます。
これは、どうやったら治るのか良かったらまたアドバイスください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
C言語 関数プロトタイプ宣言の...
-
数値を指数部と仮数部に分離したい
-
学校の課題で2次方程式のプログ...
-
関数におけるif文とreturn文に...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
C言語で表記についの質問です
-
指数の表示
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
物体が往復する動きを作りたい
-
C言語で内積、、、わかりません。
-
c言語のコンパイルエラー canno...
-
C言語のpow関数の不具合
-
処理時間計測
-
float?数字の後にLがつくもの
-
「割り算」 と 「分数の掛け算」
-
C++標準ライブラリィーのcomple...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報