/* s_atanf.c -- float version of s_atan.c.
* Conversion to float by Ian Lance Taylor , Cygnus Support , ian @ cygnus . com .
*/
/*
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright ( C ) 1993 by Sun Microsystems , Inc . All rights reserved .
*
* Developed at SunPro , 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$");
#include <math.h>
#include "math_private.h"
static const float atanhi[] = {
4 .6364760399 e-01 , /* atan(0.5)hi 0x3eed6338 */
7 .8539812565 e-01 , /* atan(1.0)hi 0x3f490fda */
9 .8279368877 e-01 , /* atan(1.5)hi 0x3f7b985e */
1 .5707962513 e+00 , /* atan(inf)hi 0x3fc90fda */
};
static const float atanlo[] = {
5 .0121582440 e-09 , /* atan(0.5)lo 0x31ac3769 */
3 .7748947079 e-08 , /* atan(1.0)lo 0x33222168 */
3 .4473217170 e-08 , /* atan(1.5)lo 0x33140fb4 */
7 .5497894159 e-08 , /* atan(inf)lo 0x33a22168 */
};
static const float aT[] = {
3 .3333328366 e-01 ,
-1 .9999158382 e-01 ,
1 .4253635705 e-01 ,
-1 .0648017377 e-01 ,
6 .1687607318 e-02 ,
};
static const float
one = 1 .0 ,
huge = 1 .0 e30;
float
atanf(float x)
{
float w,s1,s2,z;
int32_t ix,hx,id;
GET_FLOAT_WORD(hx,x);
ix = hx&0 x7fffffff;
if (ix>=0 x4c800000) { /* if |x| >= 2**26 */
if (ix>0 x7f800000)
return x+x; /* NaN */
if (hx>0 ) return atanhi[3 ]+*(volatile float *)&atanlo[3 ];
else return -atanhi[3 ]-*(volatile float *)&atanlo[3 ];
} if (ix < 0 x3ee00000) { /* |x| < 0.4375 */
if (ix < 0 x39800000) { /* |x| < 2**-12 */
if (huge+x>one) return x; /* raise inexact */
}
id = -1 ;
} else {
x = fabsf(x);
if (ix < 0 x3f980000) { /* |x| < 1.1875 */
if (ix < 0 x3f300000) { /* 7/16 <=|x|<11/16 */
id = 0 ; x = ((float )2 .0 *x-one)/((float )2 .0 +x);
} else { /* 11/16<=|x|< 19/16 */
id = 1 ; x = (x-one)/(x+one);
}
} else {
if (ix < 0 x401c0000) { /* |x| < 2.4375 */
id = 2 ; x = (x-(float )1 .5 )/(one+(float )1 .5 *x);
} else { /* 2.4375 <= |x| < 2**26 */
id = 3 ; x = -(float )1 .0 /x;
}
}}
/* end of argument reduction */
z = x*x;
w = z*z;
/* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
s1 = z*(aT[0 ]+w*(aT[2 ]+w*aT[4 ]));
s2 = w*(aT[1 ]+w*aT[3 ]);
if (id<0 ) return x - x*(s1+s2);
else {
z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
return (hx<0 )? -z:z;
}
}
Messung V0.5 in Prozent C=75 H=100 G=88
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-08-26)
¤
*© Formatika GbR, Deutschland