ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

今、C言語を用いてガンマ関数を計算する方法を模索中でです。
理想的にはガンマ関数の引数に数値を入れたら戻り値を返すというのがいいのですがそうもうまくいかないと思います。

そこで以下のような形で整数の場合と非整数の場合で作ることを考えています。しかし、引数が整数のときはわかるのですが、非整数のときがわかりません。どうしたらよいでしょうか。
以下に関数の概要を掲載します。
==========関数の概要===========
関数名:Gamma(x)
戻り値:double
引数:x[double]

1)引数が0より大きい整数(1,2,3...)のとき
  階乗の自己回帰文を使用して計算
2)引数が0より大きい非整数の場合
==========▲ここまで==========

このQ&Aに関連する最新のQ&A

A 回答 (3件)

奥村晴彦先生の『C言語によるアルゴリズム辞典』に載っていました。

    • good
    • 0

今の ISO C の仕様ではΓ関数もちゃんとあるんですけどね. もう 10年にもなろうというのに microsoft が対応しようとしてないのが問題なだけで.


でも, 検索すると出てくるなぁ....

参考URL:http://www.sist.ac.jp/~suganuma/cpp/2-bu/7-sho/C …
    • good
    • 0

ISO C なら tgamma.

この回答への補足

早速の回答ありがとうございます。
指摘された関数を探したのですが見当たりませんでした。
後、言い忘れましたがc言語はVisual C++2008 Express Edition
を使おうと思っていますのでよろしくお願いいたします。

補足日時:2009/05/21 08:56
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

以下のようにγ関数のプログラムを組みました。
とりあえず整数値を入力すれば、正しい値は返しているということが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);
}

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








#include <stdio.h>...続きを読む

Aベストアンサー

>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だよ

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む


人気Q&Aランキング