負数は実数型の無限大(1.#INF00)を返します。
負数は実数型の無限大(1.#INF00)を返します。
; gamma.hsp; bmpとしてデータ列を開く; 2007.12.20, 石橋祥太#module "Gamma";kzfunc(p1);p1=0~(0);p1の階乗を整数で返します。;gfunc(p1);p1のΓ(ガンマ)関数を実数で返します。;*スターリングの近似とオイラーの反射式を使用して;いますが、100を超えたあたりから精度が著しく低下;します。#define M_E 2.7182818284590452354#define PI 3.14159265358979323846#defcfunc kzfunc int u1;階乗an=1.0if u1<0 : return -logf(0);0以下repeat u1,1an*=cntloopreturn an#defcfunc gfuncx double x1x2=x1-1if x2<0|x2>Pi/2 : return -logf(0)return sqrt(Pi*2*x2)*expf(logf(x2/M_E)*(x2/M_E))#defcfunc gfunc double u1;ガンマ関数if u1<1 : u2=u1 : else : u2=-u1+1repeatif u2>Pi/2 : bnt=cnt : breaku2+loopan1=gfuncx(u2)repeat bntu2-if u2=0 : breakan1/=u2loopif u2=0 : return 1.0*kzfunc(-1+u1)if u1>=1 : if an1*sin(Pi*u1)=0 : return logf(0) : else : an1=Pi/(an1*sin(Pi*u1))if u1<1 : an2=an1/M_E*Pi/2 : else : an2=an1*M_E/Pi*2return an2#undef gfuncx#global; TESTmes gfunc(0+1) ; 0!mes gfunc(1.5) ; 0.5!mes gfunc(1+1) ; 1!mes gfunc(2.5) ; 1.5!mes gfunc(2+1) ; 2!mes gfunc(3.5) ; 2.5!mes gfunc(3+1) ; 3!mes gfunc(4.5) ; 3.5!mes gfunc(4+1) ; 4!mes gfunc(5.5) ; 4.5!mes gfunc(5+1) ; 5!mes gfunc(6.5) ; 5.5!