docs: function df(df1, df2, logp) {
        logp = logp === true;
  
        if (df1 <= 0 || df2 <= 0 || utils.hasNaN(df1, df2)) {
          return function(x) { return NaN; };
        }
  
        /* eslint-disable complexity */
        return function(x) {
           var f, q, p, dens;
  
           if (utils.hasNaN(x)) { return NaN; }
           if (x < 0) { return logp ? -Infinity : 0; }
           if (x === 0) {
              if (df1 > 2) { return logp ? -Infinity : 0; }
              if (df1 === 2) { return logp ? 0 : 1; }
              return Infinity;
           }
           if (df1 === Infinity && df2 === Infinity) {
              return x === 1 ? Infinity : logp ? -Infinity : 0;
           }
           if (df2 === Infinity) { return gamma.dgamma(df1 / 2, 2 / df1, logp)(x); }
           if (df1 > 1e14) {
              return logp ? gamma.dgamma(df2 / 2, 2 / df2, logp)(1 / x) - 2 * Math.log(x)
                          : gamma.dgamma(df2 / 2, 2 / df2, logp)(1 / x) / (x * x);
           }
  
           f = 1 / (df2 + x * df1);
           q = df2 * f;
           p = x * df1 * f;
  
           if (df1 >= 2) {
              p = x === Infinity ? 1 : p;
              dens = dbinomLog((df1 + df2 - 2) / 2, p)((df1 - 2) / 2);
              f = df1 * q / 2;
           } else {
              dens = dbinomLog((df1 + df2) / 2, p)(df1 / 2);
              f = df1 * df1 * q / (2 * p * (df1 + df2));
           }
           return logp ? Math.log(f) + dens : f * Math.exp(dens);
        };
        /* eslint-enable complexity */
     }