float log_combination_k_r_f (unsigned int k, float r) { if (!k) return 0; float val = lgammaf (k + r) - lgammaf (r) - log_factorial_f (k); return val; }
void fpoly_bessel(unsigned int _n, float * _p) { unsigned int k; unsigned int N = _n-1; for (k=0; k<_n; k++) { #if 0 // use internal log(gamma(z)) float t0 = liquid_lngammaf((float)(2*N-k)+1); float t1 = liquid_lngammaf((float)(N-k) +1); float t2 = liquid_lngammaf((float)(k) +1); #else // use standard math log(gamma(z)) float t0 = lgammaf((float)(2*N-k)+1); float t1 = lgammaf((float)(N-k) +1); float t2 = lgammaf((float)(k) +1); #endif // M_LN2 = log(2) = 0.693147180559945 float t3 = M_LN2 * (float)(N-k); // log(2^(N-k)) = log(2)*log(N-k) _p[k] = roundf(expf(t0 - t1 - t2 - t3)); #if 0 printf(" p[%3u,%3u] = %12.4e\n", k, _n, _p[k]); printf(" t0 : %12.4e\n", t0); printf(" t1 : %12.4e\n", t1); printf(" t2 : %12.4e\n", t2); printf(" t3 : %12.4e\n", t3); #endif } }
inline float score_student_t ( float x, float nu, float mu, float lambda) { // \cite{murphy2007conjugate}, Eq. 304 float p = lgammaf(nu * 0.5f + 0.5f) - lgammaf(nu * 0.5f); p += 0.5f * logf(lambda / (M_PIf * nu)); p += (-0.5f * nu - 0.5f) * logf(1.f + (lambda * sqr(x - mu)) / nu); return p; }
void test_lgamma() { static_assert((std::is_same<decltype(lgamma((double)0)), double>::value), ""); static_assert((std::is_same<decltype(lgammaf(0)), float>::value), ""); static_assert((std::is_same<decltype(lgammal(0)), long double>::value), ""); assert(lgamma(1) == 0); }
float StudentsTLogPdf::f(float nu, float mu, float sigma, const float* xs, size_t n) { float part1 = n * (lgammaf((nu + 1) / 2) - lgamma(nu / 2) - fastlog(sqrt(nu * M_PI) * sigma)); float part2 = 0.0; for (size_t i = 0; i < n; ++i) { part2 += log1p(sq((xs[i] - mu) / sigma) / nu); } return part1 - ((nu + 1) / 2) * part2; }
float AltGammaLogPdf::f(float mean, float shape, const float* xs, size_t n) { float scale = mean / shape; float part = 0.0; for (size_t i = 0; i < n; ++i) { part += (shape - 1.0) * fastlog(xs[i]) - xs[i] / scale; } float ans = -(float) n * (lgammaf(shape) + shape * fastlog(scale)) + part; assert_finite(ans); return ans; }
float GammaLogPdf::f(float alpha, float beta, const float* xs, size_t n) { float part1 = 0.0, part2 = 0.0; for (size_t i = 0; i < n; ++i) { part1 += fastlog(xs[i]); part2 += xs[i]; } return n * (alpha * fastlog(beta) - lgammaf(alpha)) + (alpha - 1) * part1 - beta * part2; }
static TACommandVerdict lgammaf_cmd(TAThread thread,TAInputStream stream) { float x, res; x = readFloat(&stream); START_TARGET_OPERATION(thread); errno = 0; res = lgammaf(x); END_TARGET_OPERATION(thread); writeInt(thread, errno); writeFloat(thread, res); writeInt(thread, signgam); sendResponse(thread); return taDefaultVerdict; }
double PoissonLogPdf::f(float lambda, unsigned int k) { return k * fastlog(lambda) - lgammaf(k + 1) - lambda; }
void domathf (void) { #ifndef NO_FLOAT float f1; float f2; int i1; f1 = acosf(0.0); fprintf( stdout, "acosf : %f\n", f1); f1 = acoshf(0.0); fprintf( stdout, "acoshf : %f\n", f1); f1 = asinf(1.0); fprintf( stdout, "asinf : %f\n", f1); f1 = asinhf(1.0); fprintf( stdout, "asinhf : %f\n", f1); f1 = atanf(M_PI_4); fprintf( stdout, "atanf : %f\n", f1); f1 = atan2f(2.3, 2.3); fprintf( stdout, "atan2f : %f\n", f1); f1 = atanhf(1.0); fprintf( stdout, "atanhf : %f\n", f1); f1 = cbrtf(27.0); fprintf( stdout, "cbrtf : %f\n", f1); f1 = ceilf(3.5); fprintf( stdout, "ceilf : %f\n", f1); f1 = copysignf(3.5, -2.5); fprintf( stdout, "copysignf : %f\n", f1); f1 = cosf(M_PI_2); fprintf( stdout, "cosf : %f\n", f1); f1 = coshf(M_PI_2); fprintf( stdout, "coshf : %f\n", f1); f1 = erff(42.0); fprintf( stdout, "erff : %f\n", f1); f1 = erfcf(42.0); fprintf( stdout, "erfcf : %f\n", f1); f1 = expf(0.42); fprintf( stdout, "expf : %f\n", f1); f1 = exp2f(0.42); fprintf( stdout, "exp2f : %f\n", f1); f1 = expm1f(0.00042); fprintf( stdout, "expm1f : %f\n", f1); f1 = fabsf(-1.123); fprintf( stdout, "fabsf : %f\n", f1); f1 = fdimf(1.123, 2.123); fprintf( stdout, "fdimf : %f\n", f1); f1 = floorf(0.5); fprintf( stdout, "floorf : %f\n", f1); f1 = floorf(-0.5); fprintf( stdout, "floorf : %f\n", f1); f1 = fmaf(2.1, 2.2, 3.01); fprintf( stdout, "fmaf : %f\n", f1); f1 = fmaxf(-0.42, 0.42); fprintf( stdout, "fmaxf : %f\n", f1); f1 = fminf(-0.42, 0.42); fprintf( stdout, "fminf : %f\n", f1); f1 = fmodf(42.0, 3.0); fprintf( stdout, "fmodf : %f\n", f1); /* no type-specific variant */ i1 = fpclassify(1.0); fprintf( stdout, "fpclassify : %d\n", i1); f1 = frexpf(42.0, &i1); fprintf( stdout, "frexpf : %f\n", f1); f1 = hypotf(42.0, 42.0); fprintf( stdout, "hypotf : %f\n", f1); i1 = ilogbf(42.0); fprintf( stdout, "ilogbf : %d\n", i1); /* no type-specific variant */ i1 = isfinite(3.0); fprintf( stdout, "isfinite : %d\n", i1); /* no type-specific variant */ i1 = isgreater(3.0, 3.1); fprintf( stdout, "isgreater : %d\n", i1); /* no type-specific variant */ i1 = isgreaterequal(3.0, 3.1); fprintf( stdout, "isgreaterequal : %d\n", i1); /* no type-specific variant */ i1 = isinf(3.0); fprintf( stdout, "isinf : %d\n", i1); /* no type-specific variant */ i1 = isless(3.0, 3.1); fprintf( stdout, "isless : %d\n", i1); /* no type-specific variant */ i1 = islessequal(3.0, 3.1); fprintf( stdout, "islessequal : %d\n", i1); /* no type-specific variant */ i1 = islessgreater(3.0, 3.1); fprintf( stdout, "islessgreater : %d\n", i1); /* no type-specific variant */ i1 = isnan(0.0); fprintf( stdout, "isnan : %d\n", i1); /* no type-specific variant */ i1 = isnormal(3.0); fprintf( stdout, "isnormal : %d\n", i1); /* no type-specific variant */ f1 = isunordered(1.0, 2.0); fprintf( stdout, "isunordered : %d\n", i1); f1 = j0f(1.2); fprintf( stdout, "j0f : %f\n", f1); f1 = j1f(1.2); fprintf( stdout, "j1f : %f\n", f1); f1 = jnf(2,1.2); fprintf( stdout, "jnf : %f\n", f1); f1 = ldexpf(1.2,3); fprintf( stdout, "ldexpf : %f\n", f1); f1 = lgammaf(42.0); fprintf( stdout, "lgammaf : %f\n", f1); f1 = llrintf(-0.5); fprintf( stdout, "llrintf : %f\n", f1); f1 = llrintf(0.5); fprintf( stdout, "llrintf : %f\n", f1); f1 = llroundf(-0.5); fprintf( stdout, "lroundf : %f\n", f1); f1 = llroundf(0.5); fprintf( stdout, "lroundf : %f\n", f1); f1 = logf(42.0); fprintf( stdout, "logf : %f\n", f1); f1 = log10f(42.0); fprintf( stdout, "log10f : %f\n", f1); f1 = log1pf(42.0); fprintf( stdout, "log1pf : %f\n", f1); f1 = log2f(42.0); fprintf( stdout, "log2f : %f\n", f1); f1 = logbf(42.0); fprintf( stdout, "logbf : %f\n", f1); f1 = lrintf(-0.5); fprintf( stdout, "lrintf : %f\n", f1); f1 = lrintf(0.5); fprintf( stdout, "lrintf : %f\n", f1); f1 = lroundf(-0.5); fprintf( stdout, "lroundf : %f\n", f1); f1 = lroundf(0.5); fprintf( stdout, "lroundf : %f\n", f1); f1 = modff(42.0,&f2); fprintf( stdout, "lmodff : %f\n", f1); f1 = nanf(""); fprintf( stdout, "nanf : %f\n", f1); f1 = nearbyintf(1.5); fprintf( stdout, "nearbyintf : %f\n", f1); f1 = nextafterf(1.5,2.0); fprintf( stdout, "nextafterf : %f\n", f1); f1 = powf(3.01, 2.0); fprintf( stdout, "powf : %f\n", f1); f1 = remainderf(3.01,2.0); fprintf( stdout, "remainderf : %f\n", f1); f1 = remquof(29.0,3.0,&i1); fprintf( stdout, "remquof : %f\n", f1); f1 = rintf(0.5); fprintf( stdout, "rintf : %f\n", f1); f1 = rintf(-0.5); fprintf( stdout, "rintf : %f\n", f1); f1 = roundf(0.5); fprintf( stdout, "roundf : %f\n", f1); f1 = roundf(-0.5); fprintf( stdout, "roundf : %f\n", f1); f1 = scalblnf(1.2,3); fprintf( stdout, "scalblnf : %f\n", f1); f1 = scalbnf(1.2,3); fprintf( stdout, "scalbnf : %f\n", f1); /* no type-specific variant */ i1 = signbit(1.0); fprintf( stdout, "signbit : %i\n", i1); f1 = sinf(M_PI_4); fprintf( stdout, "sinf : %f\n", f1); f1 = sinhf(M_PI_4); fprintf( stdout, "sinhf : %f\n", f1); f1 = sqrtf(9.0); fprintf( stdout, "sqrtf : %f\n", f1); f1 = tanf(M_PI_4); fprintf( stdout, "tanf : %f\n", f1); f1 = tanhf(M_PI_4); fprintf( stdout, "tanhf : %f\n", f1); f1 = tgammaf(2.1); fprintf( stdout, "tgammaf : %f\n", f1); f1 = truncf(3.5); fprintf( stdout, "truncf : %f\n", f1); f1 = y0f(1.2); fprintf( stdout, "y0f : %f\n", f1); f1 = y1f(1.2); fprintf( stdout, "y1f : %f\n", f1); f1 = ynf(3,1.2); fprintf( stdout, "ynf : %f\n", f1); #endif }
//------------------------------------------------------------------------------ double Cmath::lgamma( double x ) { return (double)lgammaf( (float)x ); }
float gammaf(float x) { return lgammaf(x); }
int main(int argc, char *argv[]) { float x; x = lgammaf((float) argc); return 0; }
TEST(math, lgammaf) { ASSERT_FLOAT_EQ(logf(24.0f), lgammaf(5.0f)); }
static int testf(float float_x, long double long_double_x, /*float complex float_complex_x,*/ int int_x, long long_x) { int r = 0; r += acosf(float_x); r += acoshf(float_x); r += asinf(float_x); r += asinhf(float_x); r += atan2f(float_x, float_x); r += atanf(float_x); r += atanhf(float_x); /*r += cargf(float_complex_x); - will fight with complex numbers later */ r += cbrtf(float_x); r += ceilf(float_x); r += copysignf(float_x, float_x); r += cosf(float_x); r += coshf(float_x); r += erfcf(float_x); r += erff(float_x); r += exp2f(float_x); r += expf(float_x); r += expm1f(float_x); r += fabsf(float_x); r += fdimf(float_x, float_x); r += floorf(float_x); r += fmaf(float_x, float_x, float_x); r += fmaxf(float_x, float_x); r += fminf(float_x, float_x); r += fmodf(float_x, float_x); r += frexpf(float_x, &int_x); r += gammaf(float_x); r += hypotf(float_x, float_x); r += ilogbf(float_x); r += ldexpf(float_x, int_x); r += lgammaf(float_x); r += llrintf(float_x); r += llroundf(float_x); r += log10f(float_x); r += log1pf(float_x); r += log2f(float_x); r += logbf(float_x); r += logf(float_x); r += lrintf(float_x); r += lroundf(float_x); r += modff(float_x, &float_x); r += nearbyintf(float_x); r += nexttowardf(float_x, long_double_x); r += powf(float_x, float_x); r += remainderf(float_x, float_x); r += remquof(float_x, float_x, &int_x); r += rintf(float_x); r += roundf(float_x); #ifdef __UCLIBC_SUSV3_LEGACY__ r += scalbf(float_x, float_x); #endif r += scalblnf(float_x, long_x); r += scalbnf(float_x, int_x); r += significandf(float_x); r += sinf(float_x); r += sinhf(float_x); r += sqrtf(float_x); r += tanf(float_x); r += tanhf(float_x); r += tgammaf(float_x); r += truncf(float_x); return r; }
int main() { a = exp(a); b = expf(b); c = fastexp(c); d = fasterexp(c); printf("%f %f %f %f\n", a, b, c, d); a = log(a); b = logf(b); c = fastlog(c); d = fasterlog(c); printf("%f %f %f %f\n", a, b, c, d); a = pow(a,a); b = pow(b,b); c = fastpow(c,c); d = fasterpow(c,c); printf("%f %f %f %f\n", a, b, c, d); a = sin(a); b = sinf(b); c = fastsin(c); d = fastersin(c); printf("%f %f %f %f\n", a, b, c, d); a = cos(a); b = cosf(b); c = fastcos(c); d = fastercos(c); printf("%f %f %f %f\n", a, b, c, d); a = tan(a); b = tanf(b); c = fasttan(c); d = fastertan(c); printf("%f %f %f %f\n", a, b, c, d); a = asin(a); b = asinf(b); printf("%f %f %f %f\n", a, b, c, d); a = acos(a); b = acosf(b); printf("%f %f %f %f\n", a, b, c, d); a = atan(a); b = atanf(b); printf("%f %f %f %f\n", a, b, c, d); a = sinh(a); b = sinhf(b); c = fastsinh(c); d = fastersinh(c); printf("%f %f %f %f\n", a, b, c, d); a = cosh(a); b = coshf(b); c = fastcosh(c); d = fastercosh(c); printf("%f %f %f %f\n", a, b, c, d); a = tanh(a); b = tanhf(b); c = fasttanh(c); d = fastertanh(c); printf("%f %f %f %f\n", a, b, c, d); a = lgamma(a); b = lgammaf(b); c = fastlgamma(c); d = fasterlgamma(c); printf("%f %f %f %f\n", a, b, c, d); return 0; }
float AltGammaLogPdf::f(float mean, float shape, float x) { float scale = mean / shape; float part = (shape - 1.0) * fastlog(x) - x / scale; return -(lgammaf(shape) + shape * fastlog(scale)) + part; }
__global__ void FloatMathPrecise() { int iX; float fX, fY; acosf(1.0f); acoshf(1.0f); asinf(0.0f); asinhf(0.0f); atan2f(0.0f, 1.0f); atanf(0.0f); atanhf(0.0f); cbrtf(0.0f); fX = ceilf(0.0f); fX = copysignf(1.0f, -2.0f); cosf(0.0f); coshf(0.0f); cospif(0.0f); cyl_bessel_i0f(0.0f); cyl_bessel_i1f(0.0f); erfcf(0.0f); erfcinvf(2.0f); erfcxf(0.0f); erff(0.0f); erfinvf(1.0f); exp10f(0.0f); exp2f(0.0f); expf(0.0f); expm1f(0.0f); fX = fabsf(1.0f); fdimf(1.0f, 0.0f); fdividef(0.0f, 1.0f); fX = floorf(0.0f); fmaf(1.0f, 2.0f, 3.0f); fX = fmaxf(0.0f, 0.0f); fX = fminf(0.0f, 0.0f); fmodf(0.0f, 1.0f); frexpf(0.0f, &iX); hypotf(1.0f, 0.0f); ilogbf(1.0f); isfinite(0.0f); fX = isinf(0.0f); fX = isnan(0.0f); j0f(0.0f); j1f(0.0f); jnf(-1.0f, 1.0f); ldexpf(0.0f, 0); lgammaf(1.0f); llrintf(0.0f); llroundf(0.0f); log10f(1.0f); log1pf(-1.0f); log2f(1.0f); logbf(1.0f); logf(1.0f); lrintf(0.0f); lroundf(0.0f); modff(0.0f, &fX); fX = nanf("1"); fX = nearbyintf(0.0f); nextafterf(0.0f, 0.0f); norm3df(1.0f, 0.0f, 0.0f); norm4df(1.0f, 0.0f, 0.0f, 0.0f); normcdff(0.0f); normcdfinvf(1.0f); fX = 1.0f; normf(1, &fX); powf(1.0f, 0.0f); rcbrtf(1.0f); remainderf(2.0f, 1.0f); remquof(1.0f, 2.0f, &iX); rhypotf(0.0f, 1.0f); fY = rintf(1.0f); rnorm3df(0.0f, 0.0f, 1.0f); rnorm4df(0.0f, 0.0f, 0.0f, 1.0f); fX = 1.0f; rnormf(1, &fX); fY = roundf(0.0f); rsqrtf(1.0f); scalblnf(0.0f, 1); scalbnf(0.0f, 1); signbit(1.0f); sincosf(0.0f, &fX, &fY); sincospif(0.0f, &fX, &fY); sinf(0.0f); sinhf(0.0f); sinpif(0.0f); sqrtf(0.0f); tanf(0.0f); tanhf(0.0f); tgammaf(2.0f); fY = truncf(0.0f); y0f(1.0f); y1f(1.0f); ynf(1, 1.0f); }