function lnf( x ) {
	var hfsq;
	var ix;
	var t2;
	var t1;
	var k;
	var R;
	var f;
	var i;
	var j;
	var s;
	var w;
	var z;

	if ( x === 0.0 ) {
		return NINF;
	}
	if ( isnanf( x ) || x < 0.0 ) {
		return NaN;
	}
	x = float64ToFloat32( x );
	ix = toWordf( x );
	k = 0;

	// x < 2**-126
	if ( ix < 0x00800000 ) {
		k -= 25;

		// Subnormal number, scale up x
		x = float64ToFloat32( x * TWO25 );
		ix = toWordf( x );
	}
	if ( ix >= FLOAT32_EXPONENT_MASK ) {
		return float64ToFloat32( x + x );
	}
	k = float64ToFloat32( k + float64ToFloat32( ( ix >> 23 ) - FLOAT32_EXPONENT_BIAS ) ); // eslint-disable-line max-len
	ix &= FLOAT32_SIGNIFICAND_MASK;
	i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000;

	// Normalize x or x/2
	x = fromWordf( ix | ( i ^ 0x3f800000 ) );
	k = float64ToFloat32( k + ( i >> 23 ) );
	f = float64ToFloat32( x - 1.0 );

	// -2**-9 <= f < 2**-9
	if ( ( FLOAT32_SIGNIFICAND_MASK & float64ToFloat32( 0x8000 + ix ) ) < 0xc000 ) { // eslint-disable-line max-len
		if ( f === 0.0 ) {
			if ( k === 0 ) {
				return 0.0;
			}
			return float64ToFloat32( float64ToFloat32( k * LN2_HI ) + float64ToFloat32( k * LN2_LO ) ); // eslint-disable-line max-len
		}
		R = float64ToFloat32( float64ToFloat32( f * f ) * float64ToFloat32( 0.5 - float64ToFloat32( ONE_THIRD * f ) ) ); // eslint-disable-line max-len
		if ( k === 0 ) {
			return float64ToFloat32( f - R );
		}
		return float64ToFloat32( float64ToFloat32( k * LN2_HI ) - float64ToFloat32( float64ToFloat32( R - float64ToFloat32( k * LN2_LO ) ) - f ) ); // eslint-disable-line max-len
	}
	s = float64ToFloat32( f / float64ToFloat32( 2.0 + f ) );
	z = float64ToFloat32( s * s );
	i = ix - ( 0x6147a << 3 );
	w = float64ToFloat32( z * z );
	j = ( 0x6b851 << 3 ) - ix;
	t1 = float64ToFloat32( w * float64ToFloat32( polyvalP( w ) ) );
	t2 = float64ToFloat32( z * float64ToFloat32( polyvalQ( w ) ) );
	i |= j;
	R = float64ToFloat32( t2 + t1 );
	if ( i > 0 ) {
		hfsq = float64ToFloat32( 0.5 * float64ToFloat32( f * f ) );
		if ( k === 0 ) {
			return float64ToFloat32( f - float64ToFloat32( hfsq - float64ToFloat32( s * float64ToFloat32( hfsq + R ) ) ) ); // eslint-disable-line max-len
		}
		return float64ToFloat32( float64ToFloat32( k * LN2_HI ) - float64ToFloat32( float64ToFloat32( hfsq - float64ToFloat32( ( s * float64ToFloat32( hfsq + R ) ) + float64ToFloat32( k * LN2_LO ) ) ) - f ) ); // eslint-disable-line max-len
	}
	if ( k === 0 ) {
		return float64ToFloat32( f - float64ToFloat32( s * float64ToFloat32( f - R ) ) ); // eslint-disable-line max-len
	}
	return float64ToFloat32( float64ToFloat32( k * LN2_HI ) - float64ToFloat32( float64ToFloat32( float64ToFloat32( s * float64ToFloat32( f - R ) ) - float64ToFloat32( k * LN2_LO ) ) - f ) ); // eslint-disable-line max-len
}
Evaluates the natural logarithm of a single-precision floating-point number.

@param {NonNegativeNumber} x - input value
@returns {number} function value

@example
var v = lnf( 4.0 );
// returns ~1.386

@example
var v = lnf( 0.0 );
// returns -Infinity

@example
var v = lnf( Infinity );
// returns Infinity

@example
var v = lnf( NaN );
// returns NaN

@example
var v = lnf( -4.0 );
// returns NaN