/* origin: FreeBSD /usr/src/lib/msun/src/e_jnf.c */
/*
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
 */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

#define _GNU_SOURCE
#include "libm.h"

float jnf(int n, float x) {
    uint32_t ix;
    int nm1, sign, i;
    float a, b, temp;

    GET_FLOAT_WORD(ix, x);
    sign = ix >> 31;
    ix &= 0x7fffffff;
    if (ix > 0x7f800000) /* nan */
        return x;

    /* J(-n,x) = J(n,-x), use |n|-1 to avoid overflow in -n */
    if (n == 0)
        return j0f(x);
    if (n < 0) {
        nm1 = -(n + 1);
        x = -x;
        sign ^= 1;
    } else
        nm1 = n - 1;
    if (nm1 == 0)
        return j1f(x);

    sign &= n; /* even n: 0, odd n: signbit(x) */
    x = fabsf(x);
    if (ix == 0 || ix == 0x7f800000) /* if x is 0 or inf */
        b = 0.0f;
    else if (nm1 < x) {
        /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
        a = j0f(x);
        b = j1f(x);
        for (i = 0; i < nm1;) {
            i++;
            temp = b;
            b = b * (2.0f * i / x) - a;
            a = temp;
        }
    } else {
        if (ix < 0x35800000) { /* x < 2**-20 */
                               /* x is tiny, return the first Taylor expansion of J(n,x)
                                * J(n,x) = 1/n!*(x/2)^n  - ...
                                */
            if (nm1 > 8)       /* underflow */
                nm1 = 8;
            temp = 0.5f * x;
            b = temp;
            a = 1.0f;
            for (i = 2; i <= nm1 + 1; i++) {
                a *= (float)i; /* a = n! */
                b *= temp;     /* b = (x/2)^n */
            }
            b = b / a;
        } else {
            /* use backward recurrence */
            /*                      x      x^2      x^2
             *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
             *                      2n  - 2(n+1) - 2(n+2)
             *
             *                      1      1        1
             *  (for large x)   =  ----  ------   ------   .....
             *                      2n   2(n+1)   2(n+2)
             *                      -- - ------ - ------ -
             *                       x     x         x
             *
             * Let w = 2n/x and h=2/x, then the above quotient
             * is equal to the continued fraction:
             *                  1
             *      = -----------------------
             *                     1
             *         w - -----------------
             *                        1
             *              w+h - ---------
             *                     w+2h - ...
             *
             * To determine how many terms needed, let
             * Q(0) = w, Q(1) = w(w+h) - 1,
             * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
             * When Q(k) > 1e4      good for single
             * When Q(k) > 1e9      good for double
             * When Q(k) > 1e17     good for quadruple
             */
            /* determine k */
            float t, q0, q1, w, h, z, tmp, nf;
            int k;

            nf = nm1 + 1.0f;
            w = 2 * nf / x;
            h = 2 / x;
            z = w + h;
            q0 = w;
            q1 = w * z - 1.0f;
            k = 1;
            while (q1 < 1.0e4f) {
                k += 1;
                z += h;
                tmp = z * q1 - q0;
                q0 = q1;
                q1 = tmp;
            }
            for (t = 0.0f, i = k; i >= 0; i--)
                t = 1.0f / (2 * (i + nf) / x - t);
            a = t;
            b = 1.0f;
            /*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
             *  Hence, if n*(log(2n/x)) > ...
             *  single 8.8722839355e+01
             *  double 7.09782712893383973096e+02
             *  long double 1.1356523406294143949491931077970765006170e+04
             *  then recurrent value may overflow and the result is
             *  likely underflow to zero
             */
            tmp = nf * logf(fabsf(w));
            if (tmp < 88.721679688f) {
                for (i = nm1; i > 0; i--) {
                    temp = b;
                    b = 2.0f * i * b / x - a;
                    a = temp;
                }
            } else {
                for (i = nm1; i > 0; i--) {
                    temp = b;
                    b = 2.0f * i * b / x - a;
                    a = temp;
                    /* scale b to avoid spurious overflow */
                    if (b > 0x1p60f) {
                        a /= b;
                        t /= b;
                        b = 1.0f;
                    }
                }
            }
            z = j0f(x);
            w = j1f(x);
            if (fabsf(z) >= fabsf(w))
                b = t * z / b;
            else
                b = t * w / a;
        }
    }
    return sign ? -b : b;
}

float ynf(int n, float x) {
    uint32_t ix, ib;
    int nm1, sign, i;
    float a, b, temp;

    GET_FLOAT_WORD(ix, x);
    sign = ix >> 31;
    ix &= 0x7fffffff;
    if (ix > 0x7f800000) /* nan */
        return x;
    if (sign && ix != 0) /* x < 0 */
        return 0 / 0.0f;
    if (ix == 0x7f800000)
        return 0.0f;

    if (n == 0)
        return y0f(x);
    if (n < 0) {
        nm1 = -(n + 1);
        sign = n & 1;
    } else {
        nm1 = n - 1;
        sign = 0;
    }
    if (nm1 == 0)
        return sign ? -y1f(x) : y1f(x);

    a = y0f(x);
    b = y1f(x);
    /* quit if b is -inf */
    GET_FLOAT_WORD(ib, b);
    for (i = 0; i < nm1 && ib != 0xff800000;) {
        i++;
        temp = b;
        b = (2.0f * i / x) * b - a;
        GET_FLOAT_WORD(ib, b);
        a = temp;
    }
    return sign ? -b : b;
}
