• ベストアンサー

C言語によるガンマ関数の記述

今、C言語を用いてガンマ関数を計算する方法を模索中でです。 理想的にはガンマ関数の引数に数値を入れたら戻り値を返すというのがいいのですがそうもうまくいかないと思います。 そこで以下のような形で整数の場合と非整数の場合で作ることを考えています。しかし、引数が整数のときはわかるのですが、非整数のときがわかりません。どうしたらよいでしょうか。 以下に関数の概要を掲載します。 ==========関数の概要=========== 関数名:Gamma(x) 戻り値:double 引数:x[double] 1)引数が0より大きい整数(1,2,3...)のとき   階乗の自己回帰文を使用して計算 2)引数が0より大きい非整数の場合 ==========▲ここまで==========

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

  • ベストアンサー
noname#245945
noname#245945
回答No.3

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

参考URL:
http://www.sist.ac.jp/~suganuma/cpp/2-bu/7-sho/C++/gamma.txt
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ISO C なら tgamma.

yf491224
質問者

補足

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

関連するQ&A

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • C言語 プログラミング 関数

    文字列を引数とし、それをint型の整数に変換し戻り値として返す関数を作りたいんですが、どのように作ったらいいでしょうか? お願いします。

  • (C,C++言語)関数の引数は自動キャストされる?

    プログラミング言語C,C++の数値計算に関する質問です. 整数データ変数同士のみの計算結果は小数点以下は切り捨てられますよね. もし実数型で計結果を得たいときは,int変数を(double)や(float)でキャストしてあげなければならないことは知っています. ここで,仮引数リストにdouble型変数が設定されている関数の引数にint型変数を与えた時,関数の呼び出し時にキャストしなくても自動でキャストされるのでしょうか. 以下のサンプルコードを作成し,実行してみた結果を次に示します. ---サンプル--- #include <iostream> using namespace std; void printDouble(double val, double val2) { cout << "(double)val = " << val / val2 << endl; } int main(void) { for (int i = 1; i < 5; i++) { cout << i / (i * 2) << endl; printDouble(i,i*2); } } -----実行結果---- 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 ------------------------- 関数の外での計算は整数に丸められてしまうので i / ( i * 2 ) 計算結果はゼロに,関数の中では与えられた i はdouble型として扱われるので小数点以下の値も残っているということですよね. この場合,printDouble関数へ整数を与えるときには printDouble( (double)i , (double)( i * 2 ) ); といったようにわざわざキャストしなくても自動で仮引数の型でキャストされて関数が呼び出されると理解してもよいのでしょうか. 実行結果から明らかだろ,思われてしまうかもしれませんが,何かの参考書に記述されているのを見たり,人からそう教わったわけではなく,また関数のオーバーロードのこともありますので,質問させて頂きました.よろしくお願いいたします.

  • C言語の高階関数についてです。

    C言語の高階関数についてです。 double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、 「関数を引数にする関数」を引数にする関数って作れますか??? その場合は、引数のところどうやって書けばいいでしょうか??

  • c言語の関数定義について

    次の関数定義を考える. int f(int x) {if (x > 0) {return x * f(x-1);} else {return 1;} } この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ.ただし,オーバーフロー(overflow) については考慮しなくてよい. ”この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • C言語(引数)

    はじめまして。 C言語を習い始めたものです。 関数を定義するとき、よく耳にする、仮引数や実引数があると思います。 仮引数は関数の定義内で値をうけとる変数のことであり 実引数は関数を呼び出す際に渡す値を実引数というらしいのですが どこからどこまでを仮引数と呼ぶのかわかりません。 例えば、 fの関数の定義内で ↓があるとします。 (関数にする意味はないのですが、確認のためあしからず・・・) double f(double x) {     x=5;     return(x); } この場合、仮引数とよばれるものは double f(double x)の xが仮引数であって x=5;のxは仮引数と呼ばないのでしょうか?? もしそうならば void f(double x) { printf("%f",x); } のprintf("%f",x);内のxは仮引数とよぶのでしょうか? 質問の内容が意味不明かもしれませんが よろしくお願いします。

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語の関数について。

    学校の課題がわからないので教えてください。 1. 次の関数recfunc()は関数内で自分自身を呼び出す再起関数である。 int recfunc(int x){ if(x<=0)return -1; else if(x==1) return 3; else return 3*recfunc(x-1)-2; } 引数に1,2,3,4,5,...を与えたときの返り値を求めよ。その結果から、一般に 整数値nが与えられたとき、どのような値が計算されるか推測せよ。 一体何を返す関数だろうか?またどのようにその計算が実現されているか を簡潔に述べよ。 2.どのような再帰関数も、再帰を用いない関数に書き換えることができる。 問題1の関数recfunc()と同じ引数、同じ返り値をもつ再帰を用いない関数 func()を作成せよ。 2問も質問してすみません。 このプログラミングのレポートを提出しなくてはならないので困ってます。 何卒よろしくお願いします。

  • C言語

    毎度毎度お世話になります<(_ _)> 今回は関数のところで躓いています(;´Д`) 問題は二つなんですけど、 「二つの整数変数の引数の和を計算して結果を戻す関数plusを作成し、 それを利用して以下の実行結果になるようにしなさい。」 ■ 実行例 ■ Input two integer numbers 4 5 4+5=9 (数字は1例です) 「会場を求める関数factとべき乗を求める関数powintを利用して、 n!/xのn乗を求める関数pow_factを作成しなさい。 ただし、pow_fact関数は因数に整数値をとるが、戻り値は実数になることに注意しなさい。」 ■ 実行例 ■ Input number 5    1    1.000000000    2    0.500000000    3    0.222222224    4    0.093750000    5    0.038400002 ( 数字は1例です ) といった感じです。 最初の問題は int plus( int a, int b){ int y = 1; ココがわからない return y; } この先もわからない といった感じです。 二問目に関してはさっぱりわかってません(;´Д`) 回答、アドバイスなど沢山の回答お待ちしています。 ちなみにLinuxのGNOME端末をつかっています。

  • C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からず

    C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からずに困っています。 C言語ラストの問題が一番難しくて、全然分からずに困っています。 以下の点に留意して、一辺の長さを入力すると、正方形の面積と直方体の体積を計算するプログラムを作成する。main内 1)整数型の変数length、men、taiを宣言する。 2)実行例と同様の表示になるように、“一辺の長さを入力してください。”を表示し、入力された値を、変数lengthに読み込む。 3)作成する関数名は、titleとし、lengthを引数とし、関数titleを使う。 4)正方形の面積を計算する関数の関数名は、squareとし、lengthを引数とし、戻り値をmen に代入する。 5)直方体の体積を計算する関数の関数名は、qubeとし、lengthを引数とし、戻り値をtai に代入する。 6)“一辺○○の正方形の面積は ○○です。”と表示する。 7)“一辺○○の直方体の体積は ○○です。”と表示する。 関数title内 1)引数を変数名xとする。 2)下記の実行例の様になるように、表示を行う。 関数square内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)正方形の面積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 関数qube内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)直方体の体積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 という問題です。 考えて作ってみたのが下のですが、間違いだらけでどうしようもありません。 #include <stdio.h> void main(void) { int length,men,tai; printf("一辺の長さを入力してください。\n"); scanf("%d",&length); men=square(length); tai=qube(length); printf("***********************************\n"); printf("* 一辺%d *,&lenght); printf("*正方形の面積*") printf("*直方体の体積*") printf("*を計算します。*") printf("*************************\n"); } int square(x) { int val; val=x*x; return val; } int qube(y) { int val; val=x*x*x return val; } どなたかよかったら教えてください。 よろしくお願いします。

専門家に質問してみよう