/* @(#)e_acos.c 1.3 95/01/18 */
/*
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright ( C ) 1993 by Sun Microsystems , Inc . All rights reserved .
*
* Developed at SunSoft , a Sun Microsystems , Inc . business .
* Permission to use , copy , modify , and distribute this
* software is freely granted , provided that this notice
* is preserved .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
//#include <sys/cdefs.h>
//__FBSDID("$FreeBSD$");
/* __ieee754_acos(x)
* Method :
* acos ( x ) = pi / 2 - asin ( x )
* acos ( - x ) = pi / 2 + asin ( x )
* For | x | < = 0 . 5
* acos ( x ) = pi / 2 - ( x + x * x ^ 2 * R ( x ^ 2 ) ) ( see asin . c )
* For x > 0 . 5
* acos ( x ) = pi / 2 - ( pi / 2 - 2 asin ( sqrt ( ( 1 - x ) / 2 ) ) )
* = 2 asin ( sqrt ( ( 1 - x ) / 2 ) )
* = 2 s + 2 s * z * R ( z ) . . . z = ( 1 - x ) / 2 , s = sqrt ( z )
* = 2 f + ( 2 c + 2 s * z * R ( z ) )
* where f = hi part of s , and c = ( z - f * f ) / ( s + f ) is the correction term
* for f so that f + c ~ sqrt ( z ) .
* For x < - 0 . 5
* acos ( x ) = pi - 2 asin ( sqrt ( ( 1 - | x | ) / 2 ) )
* = pi - 0 . 5 * ( s + s * z * R ( z ) ) , where z = ( 1 - | x | ) / 2 , s = sqrt ( z )
*
* Special cases :
* if x is NaN , return x itself ;
* if | x | > 1 , return NaN with invalid signal .
*
* Function needed : sqrt
*/
#include <float .h>
#include <math.h>
#include "math_private.h"
static const double
one= 1 .00000000000000000000 e+00 , /* 0x3FF00000, 0x00000000 */
pi = 3 .14159265358979311600 e+00 , /* 0x400921FB, 0x54442D18 */
pio2_hi = 1 .57079632679489655800 e+00 ; /* 0x3FF921FB, 0x54442D18 */
static volatile double
pio2_lo = 6 .12323399573676603587 e-17 ; /* 0x3C91A626, 0x33145C07 */
static const double
pS0 = 1 .66666666666666657415 e-01 , /* 0x3FC55555, 0x55555555 */
pS1 = -3 .25565818622400915405 e-01 , /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2 .01212532134862925881 e-01 , /* 0x3FC9C155, 0x0E884455 */
pS3 = -4 .00555345006794114027 e-02 , /* 0xBFA48228, 0xB5688F3B */
pS4 = 7 .91534994289814532176 e-04 , /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3 .47933107596021167570 e-05 , /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2 .40339491173441421878 e+00 , /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2 .02094576023350569471 e+00 , /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6 .88283971605453293030 e-01 , /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7 .70381505559019352791 e-02 ; /* 0x3FB3B8C5, 0xB12E9282 */
double
__ieee754_acos(double x)
{
double z,p,q,r,w,s,c,df;
int32_t hx,ix;
GET_HIGH_WORD(hx,x);
ix = hx&0 x7fffffff;
if (ix>=0 x3ff00000) { /* |x| >= 1 */
u_int32_t lx;
GET_LOW_WORD(lx,x);
if (((ix-0 x3ff00000)|lx)==0 ) { /* |x|==1 */
if (hx>0 ) return 0 .0 ; /* acos(1) = 0 */
else return pi+2 .0 *pio2_lo; /* acos(-1)= pi */
}
return (x-x)/(x-x); /* acos(|x|>1) is NaN */
}
if (ix<0 x3fe00000) { /* |x| < 0.5 */
if (ix<=0 x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
z = x*x;
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
r = p/q;
return pio2_hi - (x - (pio2_lo-x*r));
} else if (hx<0 ) { /* x < -0.5 */
z = (one+x)*0 .5 ;
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
s = sqrt(z);
r = p/q;
w = r*s-pio2_lo;
return pi - 2 .0 *(s+w);
} else { /* x > 0.5 */
z = (one-x)*0 .5 ;
s = sqrt(z);
df = s;
SET_LOW_WORD(df,0 );
c = (z-df*df)/(s+df);
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
r = p/q;
w = r*s+c;
return 2 .0 *(df+w);
}
}
Messung V0.5 in Prozent C=75 H=100 G=88
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-08-24)
¤
*© Formatika GbR, Deutschland