function hyp2f1ra( a, b, c, x, loss ) {
	var f2Val;
	var f1Val;
	var f0Val;
	var err;
	var da;
	var f1;
	var f0;
	var t;
	var n;

	loss = 0.0;
	err = 0.0;

	if ( ( c < 0.0 && a <= c ) || ( c >= 0.0 && a >= c ) ) {
		da = round( a-c );
	} else {
		da = round( a );
	}

	t = a - da;
	if ( abs( da ) > MAX_ITERATIONS ) {
		// Too expensive to compute, so return `NaN`:
		loss = 1.0;
		return {
			'value': NaN,
			'error': loss
		};
	}

	if ( da < 0.0 ) {
		// Backward recurrence...
		f2Val = 0.0;
		f1 = hys2f1( t, b, c, x, err );
		loss += f1.error;
		err = f1.error;
		f0 = hys2f1( t-1.0, b, c, x, err );
		loss += f0.error;
		t -= 1.0;
		f1Val = f1.value;
		f0Val = f0.value;
		for ( n = 1; n < -da; n++ ) {
			f2Val = f1Val;
			f1Val = f0Val;

			// eslint-disable-next-line max-len
			f0Val = -( ( ( ( (2.0*t)-c )-( t*x )+( b*x ) ) * f1Val ) + ( ( t*(x-1.0) ) * f2Val ) ) / ( c-t );
			t -= 1.0;
		}
	} else {
		// Forward recurrence...
		f2Val = 0.0;
		f1 = hys2f1( t, b, c, x, err );
		loss += f1.error;
		err = f1.error;
		f0 = hys2f1( t+1.0, b, c, x, err );
		loss += f0.error;
		t += 1.0;
		f1Val = f1.value;
		f0Val = f0.value;
		for ( n = 1; n < da; n++ ) {
			f2Val = f1Val;
			f1Val = f0Val;

			// eslint-disable-next-line max-len
			f0Val = -( ( ( ( (2.0*t)-c )-( t*x )+( b*x ) ) * f1Val ) + ( (c-t)*f2Val ) ) / ( t*(x-1.0) );
			t += 1.0;
		}
	}

	return {
		'value': f0Val,
		'error': loss
	};
}
Evaluates the Gaussian hypergeometric function by two-term recurrence in `a`.

## Notes

-   This function helps prevent losing accuracy in the highly alternating hypergeometric series and allows a and b to be reduced to smaller values.

## References

-   AMS55 #15.2.10

@private
@param {number} a - input value
@param {number} b - input value
@param {number} c - input value
@param {number} x - input value
@param {number} loss - starting loss of significance
@returns {Object} the function value and error