今、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ガンマ関数とベータ関数

積分計算でガンマ関数とベータ関数が使えそうだと判断する基準を教えてください。

Aベストアンサー

 ガンマ関数やベータ関数と言わず、特殊関数と言われるものは皆、ある特定の数学的状況を処理するために生まれた、というのが最初の動機付けです。

 ガンマ関数は最も初等的には、整数で定義されていた階乗を、ある理由のもとに(ある特定の数学的状況を処理するために)、実数まで拡張したものです。最終的には複素数にまで拡張されますが、関連するガンマ関数の公式群、ワイヤシュトラウスやハンケルの積分表示,スターリングの近似式などはどれも、特定の数学的状況に動機があります。

 ところがそういう風に色々な特殊関数を詳細に調べて行くと、例えばベータ関数とガンマ関数の関連がわかり、色々な特殊関数を、ある程度統一的に理解できないか?という話になって行きます。そこから特殊関数論が始まって、#2さんの仰るような方向にも話は発展するのだと思います。

 ただ実用的には、「ガンマ関数とベータ関数が使えそうだと判断する基準」は何か?と問われれば、ガンマ関数やベータ関数の動機付けとなった数学的状況と、与えられた数学的状況が似ているかどうかを、見抜ける目を持っているか、持っていなくても状況を調査(分析)した結果そうだったと言えるかどうかだと、言わざる得ません。この態度を、言葉を切り詰めて短く言うと、#1さんの、

>使ってみて使えたら、使える。
>それ以上でも以下でもない。

になると思えます。

 ガンマ関数やベータ関数と言わず、特殊関数と言われるものは皆、ある特定の数学的状況を処理するために生まれた、というのが最初の動機付けです。

 ガンマ関数は最も初等的には、整数で定義されていた階乗を、ある理由のもとに(ある特定の数学的状況を処理するために)、実数まで拡張したものです。最終的には複素数にまで拡張されますが、関連するガンマ関数の公式群、ワイヤシュトラウスやハンケルの積分表示,スターリングの近似式などはどれも、特定の数学的状況に動機があります。

 ところがそういう...続きを読む

Qlong double型の戻り値を持つ関数について

文字列を浮動小数点に変換したいと思っています。
StrToFloat()を用いたのですが、有効数値がケタ落ちしてしまいました。
そこで、次のように関数を定義して実行したところ、やはり戻り値の値がケタ落ちしました。
long double StrToValue(AnsiString str)
{
・・・・・
return value;
}
具体的にはlong doubleの有効数値がdouble型の有効数値にまで落ちてしまっています。
次にポインタを使い、次のように変更したのですが、結果は同じでした。
void StrToValue(AnsiString str, long double *value)
{
・・・・・
*value=・・・;
・・・・・
}
どなたか、この解決方法と、できれば理由を教えてください。
なお使用した言語は、C++Builder 5
環境はWindows 98 です。

Aベストアンサー

> そこで、デバッガを使って調べたところ、StrToValue(AnsiString str)のreturn直前では、
>  result=-1.55519334183474013
> となっており、str を正確に数値に変換していました。

ということであれば、可能ならば、関数の宣言から _fastcall を外すと、
回避できるかもしれません。


> long double convert_2(char* str)
> {
>   long double ret;
>   double a;
>   sscanf(str, "%lf", &a);
>   ret = a;
>   return ret;
> }
> a-kuma さんに作っていただいたこのプログラムでも、ret の値はreturn したときに後ろの数桁が消滅すると思われます。

こっちの関数は、*わざと* 精度を落としています。文字列→実数の展開を
double で(つまり、%lf を使って)いるので、ret に代入している時点で
long double の精度がありません。

> そこで、デバッガを使って調べたところ、StrToValue(AnsiString str)のreturn直前では、
>  result=-1.55519334183474013
> となっており、str を正確に数値に変換していました。

ということであれば、可能ならば、関数の宣言から _fastcall を外すと、
回避できるかもしれません。


> long double convert_2(char* str)
> {
>   long double ret;
>   double a;
>   sscanf(str, "%lf", &a);
>   ret = a;
>   return ret;
> }
> a-kuma さんに作っていただいたこのプ...続きを読む

QPearsonの不完全ガンマ関数

Pearsonの不完全ガンマ関数の定義を教えてください。

Aベストアンサー

物理学者の siegmund と申します.

不完全ガンマ関数は物理屋にはおなじみですが,「Pearsonの」とついているので興味をもって調べてみました.
No.1 の drmuraberg さんご紹介のページには確かに
The incomplete gamma function is defined by K. Pearson [2,p. v] to be
(1)  Γ_y(p+1) = ∫{0→y} t^p e^(-t) dt   -1<p, 0≦y
と書いてあるのですが([2,p. v]は参考文献),これでは普通の不完全ガンマ関数の定義と変わらないですね.
ただし,普通よく見るのは(例えば,Wikipedia の「不完全ガンマ関数」)
(A)  γ(s,y) = ∫{0→y} t^(s-1) e^(-t) dt   0<s, 0≦y
の形です.
y の書き方(下付にするか,かっこの中に入れるか)や,p と s の書き方の違い(p+1 = s になっているだけ)は
本質的ではありませんが,大文字Γと小文字γは重要な違いのように思われます.
その理由は普通大文字の不完全Γ関数は
(B)  Γ(s,y) = ∫{y→∞} t^(s-1) e^(-t) dt   0<s, 0≦y
で定義されるからです(積分範囲に注意).

さて,上の文献には defined by K. Pearson と書いてあるのですが,
Pearson が最初に定義したという意味ではなさそうです.
不完全ガンマ関数はルジャンドルの頃からあります
(Wikipedia には「ルジャンドルの不完全ガンマ関数」という表現があります).
なお,(A)や(B)をΓ(s)で割ったものをルジャンドルの不完全ガンマ関数ということもあります.
上の状況から察するに, drmuraberg さんご紹介のページの著者 Roy Takanaga は
最初に Pearson が定義したという意味ではなく,例えば有名な Pearson の本に定義が載っているという意味で
defined by K. Pearson [2,p. v] と書いたのではないでしょうか.
K. Pearson は数理統計学者のカール・ピアソンですかね(Wikipedia にも載っています).

で,本題ですが,いろいろ調べて
https://www.cs.purdue.edu/homes/wxg/selected_works/section_02/068.pdf
の p.467 の(1.7)式,あるいは
http://userpages.umbc.edu/~dfrey1/ench630/gamma.pdf
の p.262 の 6.5.6 に
Pearson's form of the incomplete gamma function があるのを見つけました.
上の2つはちょっと見かけは違いますが,同じものであることは簡単に示せます.

物理学者の siegmund と申します.

不完全ガンマ関数は物理屋にはおなじみですが,「Pearsonの」とついているので興味をもって調べてみました.
No.1 の drmuraberg さんご紹介のページには確かに
The incomplete gamma function is defined by K. Pearson [2,p. v] to be
(1)  Γ_y(p+1) = ∫{0→y} t^p e^(-t) dt   -1<p, 0≦y
と書いてあるのですが([2,p. v]は参考文献),これでは普通の不完全ガンマ関数の定義と変わらないですね.
ただし,普通よく見るのは(例えば,Wikipedia の「不完全ガンマ関数」)
(...続きを読む

Q関数の引数と戻り値

度々すいません。
関数に引数として配列のポインタを渡して、戻り値として配列のポインタを返したいのですが、やり方がよく分かりません。
お願いします。

Aベストアンサー

>ポインタを用いて、関数にする前のプログラムが2つ前の投稿
>「ポインタのエラー」にのっていますので、参照してください。

こちらですね。
http://www.okweb.ne.jp/kotaeru.php3?q=663939

それなら、関数の戻り値でresultを返す必要はないと思います。
こんな感じでいいと思います。

void add_n(int *a, int *b, int *result, int n)
/* n は桁数 */
{
int i, arry;

/*配列resultの初期化*/
for(i=0;i<n+1;i++) *(result+i)=0;

carry=0;

/*result=a+bの演算*/
for(i=n; i>=0; i--){
*(result+i)=*(a+i)+*(b+i)+carry;
if(*(result+i)>=10){
*(result+i)-=10;
carry=1;
}
else carry=0;
}

}

>ポインタを用いて、関数にする前のプログラムが2つ前の投稿
>「ポインタのエラー」にのっていますので、参照してください。

こちらですね。
http://www.okweb.ne.jp/kotaeru.php3?q=663939

それなら、関数の戻り値でresultを返す必要はないと思います。
こんな感じでいいと思います。

void add_n(int *a, int *b, int *result, int n)
/* n は桁数 */
{
int i, arry;

/*配列resultの初期化*/
for(i=0;i<n+1;i++) *(result+i)=0;

carry=0;

/*result=a+bの演算*/
for(i=n; i>=0; ...続きを読む

Qm!と1/2の2m乗のガンマ関数への変換

m!と1/2の2m乗のガンマ関数への変換

添付画像の式の変形でとくにm!と(1/2)の2m乗がどのガンマ関数に変形しているのかがよくわかりません。出典もとは下記リンクのp6となります。

www.sci.hyogo-u.ac.jp/maths/master/h11/kunimasa.pdf

よろしくお願いいたします。

Aベストアンサー

添付式につき、共通部部分を消去すると、
 1/m!・(1/2)^(2m)=Γ(m+1/2)/{Γ(1/2)Γ(2m+1)}
となるので、これを導くことにします。

右辺の分子
=(m-1/2)Γ(m-1/2)=(m-1/2)(m-3/2)Γ(m-3/2)
=…=(m-1/2)(m-3/2)…(m-(m-1/2))Γ(1/2)
=(2m-1)(2m-3)…1・2^(-m)・Γ(1/2)

右辺の分母
=Γ(1/2)・(2m)(2m-1)…1・Γ(1)

よって、右辺
={(2m-1)(2m-3)…1・2^(-m)}/{(2m)(2m-1)…1}
=2^(-m)/{(2m)(2m-2)…2}
=2^(-m)/{m!・2^m}
=1/m!・(1/2)^(2m)
=左辺

QC言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

C言語初心者です。
そもそもPC使うのも苦手ですがよろしくお願いします。
C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

Aベストアンサー

そんなに一気に理解しようとしても難しいですね。
http://www.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
を眺めてみてください(仮引数と実引数の意味が書いてある。ただしC言語であんまり仮引数がとか実引数が、という言い方はしないような)。
C言語においては全ての処理のかたまりが「関数」です。関数は何かの処理を行って値を返すことも返さないこともあります。
ここの例でいうとf(int x)は値を返す関数、main()は返さない関数で、ここからプログラムの処理が始まります(そういうルールになっている)。
このページのプログラムはちょっと古い書き方なんで今だと警告が出る可能性があります。

Qガンマ関数 ベータ関数 積分

int (0→1) {x^5/(1-x^4)^1/2} dx
でガンマ関数、ベータ関数 を使って解くらしいのですが、どうやって式変形していけばいいのかほとんどわかりません。

どなたかご教授よろしくお願いいたします。

Aベストアンサー

ANo.1です。
x^4 = tとでも置いてみると
与式 = (1/4)・∫[0→1]{t^(1/2)・(1-t)^(-1/2)}dt
よって
与式= (1/4)・B(3/2,1/2) = (1/4)・Γ(3/2)・Γ(1/2)/Γ(2) = (1/4)・((√π)/2)・(√π) = π/8

B(p,q);β関数、Γ(x);ガンマ関数

Q関数の引数と実引数の取り扱いについて

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました.

#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算さ...続きを読む

Aベストアンサー

> 以下のようなプログラムにするのはありでしょうか

どちらも全く同じです。
前者は、sum関数呼び出し時の実引数a,bが、それぞれsum関数の仮引数x,yに正しく対応しています。
前者は、sum関数呼び出し時の実引数x,yが、それぞれsum関数の仮引数x,yに正しく対応しています。

ところで、せっかく和の値を求めたのですから、出力する方がよいと思いませんか?

Qガンマ関数について

ガンマ関数の漸近展開のやりかたがわかりません。よろしくお願いします。

Aベストアンサー

以下のURLに導出方法が紹介されているようである。

---------------------------------------
http://wapedia.mobi/ja/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%AC%E5%BC%8F
---------------------------------------

QC言語の関数の実引数と仮引数の名前について

 C言語で関数を使う場合、実引数と仮引数の名前(変数名)は、変えなければならないのでしょうか、同じでもいいのでしょうか。C言語のルールでは、どうなっているのでしょうか。よろしくお願い致します。

Aベストアンサー

同じでも構いません。

それぞれの変数の有効範囲(スコープ)が異なりますので、問題ありません。

実引数は定義場所により有効範囲は異なりますが、仮引数はその関数の中でのみ有効です。
両方の範囲が重なった場合はその関数内では仮引数の方が有効になります。


人気Q&Aランキング

おすすめ情報