Blame sysdeps/ieee754/flt-32/e_asinf.c

Packit Service 82fcde
/* e_asinf.c -- float version of e_asin.c.
Packit Service 82fcde
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * ====================================================
Packit Service 82fcde
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Packit Service 82fcde
 *
Packit Service 82fcde
 * Developed at SunPro, a Sun Microsystems, Inc. business.
Packit Service 82fcde
 * Permission to use, copy, modify, and distribute this
Packit Service 82fcde
 * software is freely granted, provided that this notice
Packit Service 82fcde
 * is preserved.
Packit Service 82fcde
 * ====================================================
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
  Modifications for single precision expansion are
Packit Service 82fcde
  Copyright (C) 2001 Stephen L. Moshier <moshier@na-net.ornl.gov>
Packit Service 82fcde
  and are incorporated herein by permission of the author.  The author
Packit Service 82fcde
  reserves the right to distribute this material elsewhere under different
Packit Service 82fcde
  copying permissions.  These modifications are distributed here under
Packit Service 82fcde
  the following terms:
Packit Service 82fcde
Packit Service 82fcde
    This library is free software; you can redistribute it and/or
Packit Service 82fcde
    modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
    License as published by the Free Software Foundation; either
Packit Service 82fcde
    version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
    This library is distributed in the hope that it will be useful,
Packit Service 82fcde
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
    Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
    You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
    License along with this library; if not, see
Packit Service 82fcde
    <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#if defined(LIBM_SCCS) && !defined(lint)
Packit Service 82fcde
static char rcsid[] = "$NetBSD: e_asinf.c,v 1.5 1995/05/12 04:57:25 jtc Exp $";
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include <float.h>
Packit Service 82fcde
#include <math.h>
Packit Service 82fcde
#include <math_private.h>
Packit Service 82fcde
#include <math-underflow.h>
Packit Service 82fcde
Packit Service 82fcde
static const float
Packit Service 82fcde
one =  1.0000000000e+00, /* 0x3F800000 */
Packit Service 82fcde
huge =  1.000e+30,
Packit Service 82fcde
Packit Service 82fcde
pio2_hi = 1.57079637050628662109375f,
Packit Service 82fcde
pio2_lo = -4.37113900018624283e-8f,
Packit Service 82fcde
pio4_hi = 0.785398185253143310546875f,
Packit Service 82fcde
Packit Service 82fcde
/* asin x = x + x^3 p(x^2)
Packit Service 82fcde
   -0.5 <= x <= 0.5;
Packit Service 82fcde
   Peak relative error 4.8e-9 */
Packit Service 82fcde
p0 = 1.666675248e-1f,
Packit Service 82fcde
p1 = 7.495297643e-2f,
Packit Service 82fcde
p2 = 4.547037598e-2f,
Packit Service 82fcde
p3 = 2.417951451e-2f,
Packit Service 82fcde
p4 = 4.216630880e-2f;
Packit Service 82fcde
Packit Service 82fcde
float __ieee754_asinf(float x)
Packit Service 82fcde
{
Packit Service 82fcde
	float t,w,p,q,c,r,s;
Packit Service 82fcde
	int32_t hx,ix;
Packit Service 82fcde
	GET_FLOAT_WORD(hx,x);
Packit Service 82fcde
	ix = hx&0x7fffffff;
Packit Service 82fcde
	if(ix==0x3f800000) {
Packit Service 82fcde
		/* asin(1)=+-pi/2 with inexact */
Packit Service 82fcde
	    return x*pio2_hi+x*pio2_lo;
Packit Service 82fcde
	} else if(ix> 0x3f800000) {	/* |x|>= 1 */
Packit Service 82fcde
	    return (x-x)/(x-x);		/* asin(|x|>1) is NaN */
Packit Service 82fcde
	} else if (ix<0x3f000000) {	/* |x|<0.5 */
Packit Service 82fcde
	    if(ix<0x32000000) {		/* if |x| < 2**-27 */
Packit Service 82fcde
		math_check_force_underflow (x);
Packit Service 82fcde
		if(huge+x>one) return x;/* return x with inexact if x!=0*/
Packit Service 82fcde
	    } else {
Packit Service 82fcde
		t = x*x;
Packit Service 82fcde
		w = t * (p0 + t * (p1 + t * (p2 + t * (p3 + t * p4))));
Packit Service 82fcde
		return x+x*w;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
	/* 1> |x|>= 0.5 */
Packit Service 82fcde
	w = one-fabsf(x);
Packit Service 82fcde
	t = w*0.5f;
Packit Service 82fcde
	p = t * (p0 + t * (p1 + t * (p2 + t * (p3 + t * p4))));
Packit Service 82fcde
	s = sqrtf(t);
Packit Service 82fcde
	if(ix>=0x3F79999A) {	/* if |x| > 0.975 */
Packit Service 82fcde
	    t = pio2_hi-(2.0f*(s+s*p)-pio2_lo);
Packit Service 82fcde
	} else {
Packit Service 82fcde
	    int32_t iw;
Packit Service 82fcde
	    w  = s;
Packit Service 82fcde
	    GET_FLOAT_WORD(iw,w);
Packit Service 82fcde
	    SET_FLOAT_WORD(w,iw&0xfffff000);
Packit Service 82fcde
	    c  = (t-w*w)/(s+w);
Packit Service 82fcde
	    r  = p;
Packit Service 82fcde
	    p  = 2.0f*s*r-(pio2_lo-2.0f*c);
Packit Service 82fcde
	    q  = pio4_hi-2.0f*w;
Packit Service 82fcde
	    t  = pio4_hi-(p-q);
Packit Service 82fcde
	}
Packit Service 82fcde
	if(hx>0) return t; else return -t;
Packit Service 82fcde
}
Packit Service 82fcde
strong_alias (__ieee754_asinf, __asinf_finite)