Method: Math#lgamma

Defined in:
math.c

#lgamma(x) ⇒ Array, ... (private)

Returns a 2-element array equivalent to:

  [Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]

See {logarithmic gamma function}[https://en.wikipedia.org/wiki/Gamma_function#The_log-gamma_function].

- Domain: <tt>(-INFINITY, INFINITY]</tt>.
- Range of first element: <tt>(-INFINITY, INFINITY]</tt>.
- Second element is -1 or 1.

Examples:

  lgamma(-4.0) # => [Infinity, -1]
  lgamma(-3.0) # => [Infinity, -1]
  lgamma(-2.0) # => [Infinity, -1]
  lgamma(-1.0) # => [Infinity, -1]
  lgamma(0.0)  # => [Infinity, 1]

  lgamma(1.0)  # => [0.0, 1]
  lgamma(2.0)  # => [0.0, 1]
  lgamma(3.0)  # => [0.6931471805599436, 1]
  lgamma(4.0)  # => [1.7917594692280545, 1]

  lgamma(-2.5) # => [-0.05624371649767279, -1]
  lgamma(-1.5) # => [0.8600470153764797, 1]
  lgamma(-0.5) # => [1.265512123484647, -1]
  lgamma(0.5)  # => [0.5723649429247004, 1]
  lgamma(1.5)  # => [-0.12078223763524676, 1]
  lgamma(2.5)      # => [0.2846828704729205, 1]

Related: Math.gamma.

Returns ].

Returns:



1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
# File 'math.c', line 1019

static VALUE
math_lgamma(VALUE unused_obj, VALUE x)
{
    double d;
    int sign=1;
    VALUE v;
    d = Get_Double(x);
    /* check for domain error */
    if (isinf(d)) {
        if (signbit(d)) domain_error("lgamma");
        return rb_assoc_new(DBL2NUM(HUGE_VAL), INT2FIX(1));
    }
    if (d == 0.0) {
        VALUE vsign = signbit(d) ? INT2FIX(-1) : INT2FIX(+1);
        return rb_assoc_new(DBL2NUM(HUGE_VAL), vsign);
    }
    v = DBL2NUM(lgamma_r(d, &sign));
    return rb_assoc_new(v, INT2FIX(sign));
}