function frexp( x, out, stride, offset ) {
	var high;
	var exp;
	if (
		x === 0.0 || // handles -0
		isnan( x ) ||
		isInfinite( x )
	) {
		out[ offset ] = x;
		out[ offset + stride ] = 0;
		return out;
	}
	// If `x` is subnormal, normalize it...
	normalize( x, X, 1, 0 );

	// Extract the exponent from `x` and add the normalization exponent:
	exp = floatExp( X[0] ) + X[ 1 ] + 1;

	// Break `x` into two unsigned 32-bit integers (higher and lower order words):
	toWords.assign( X[ 0 ], WORDS, 1, 0 );
	high = WORDS[ 0 ];

	// Clear the exponent bits within the higher order word:
	high &= CLEAR_EXP_MASK;

	// Set the exponent bits within the higher order word to BIAS-1 (1023-1=1022):
	high |= SET_EXP_MASK;

	// Create a new floating-point number:
	x = fromWords( high, WORDS[ 1 ] );

	out[ offset ] = x;
	out[ offset + stride ] = exp;
	return out;
}
Splits a double-precision floating-point number into a normalized fraction and an integer power of two and assigns results to a provided output array.

@private
@param {number} x - input value
@param {Collection} out - output array
@param {integer} stride - output array stride
@param {NonNegativeInteger} offset - output array index offset
@returns {Collection} output array

@example
var out = frexp( 4.0, new Array( 2 ), 1, 0 );
// returns [ 0.5, 3 ]

@example
var out = frexp( 0.0, new Array( 2 ), 1, 0 );
// returns [ 0.0, 0 ]

@example
var out = frexp( -0.0, new Array( 2 ), 1, 0 );
// returns [ -0.0, 0 ]

@example
var out = frexp( NaN, new Array( 2 ), 1, 0 );
// returns [ NaN, 0 ]

@example
var out = frexp( Infinity, new Array( 2 ), 1, 0 );
// returns [ Infinity , 0 ]

@example
var out = frexp( -Infinity, new Array( 2 ), 1, 0 );
// returns [ -Infinity , 0 ]