function asin( x ) {
	var sgn;
	var zz;
	var a;
	var p;
	var z;

	if ( isnan( x ) ) {
		return NaN;
	}
	if ( x > 0.0 ) {
		a = x;
	} else {
		sgn = true;
		a = -x;
	}
	if ( a > 1.0 ) {
		return NaN;
	}
	if ( a > 0.625 ) {
		// arcsin(1-x) = pi/2 - sqrt(2x)(1+R(x))
		zz = 1.0 - a;
		p = zz * ratevalRS( zz );
		zz = sqrt( zz + zz );
		z = PIO4 - zz;
		zz = ( zz*p ) - MOREBITS;
		z -= zz;
		z += PIO4;
	} else {
		if ( a < 1.0e-8 ) {
			return x;
		}
		zz = a * a;
		z = zz * ratevalPQ( zz );
		z = ( a*z ) + a;
	}
	return ( sgn ) ? -z : z;
}
Computes the arcsine of a double-precision floating-point number.

## Method

-   A rational function of the form

    ```tex
    x + x^3 \frac{P(x^2)}{Q(x^2)}
    ```

    is used for \\(\|x\|\\) in the interval \\(\[0, 0.5\]\\). If \\(\|x\| > 0.5\\), it is transformed by the identity

    ```tex
    \operatorname{asin}(x) = \frac{\pi}{2} - 2 \operatorname{asin}( \sqrt{ (1-x)/2 } )
    ```

## Notes

-   Relative error:

    | arithmetic | domain | # trials | peak    | rms     |
    |:-----------|:-------|:---------|:--------|:--------|
    | DEC        | -1, 1  | 40000    | 2.6e-17 | 7.1e-18 |
    | IEEE       | -1, 1  | 10^6     | 1.9e-16 | 5.4e-17 |

@param {number} x - input value
@returns {number} arcsine (in radians)

@example
var v = asin( 0.0 );
// returns ~0.0

@example
var v = asin( 3.141592653589793/4.0 );
// returns ~0.903

@example
var v = asin( -3.141592653589793/6.0 );
// returns ~-0.551

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