/* @(#)e_atan2.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_atan2(y,x)
* Method :
* 1 . Reduce y to positive by atan2 ( y , x ) = - atan2 ( - y , x ) .
* 2 . Reduce x to positive by ( if x and y are unexceptional ) :
* ARG ( x + iy ) = arctan ( y / x ) . . . if x > 0 ,
* ARG ( x + iy ) = pi - arctan [ y / ( - x ) ] . . . if x < 0 ,
*
* Special cases :
*
* ATAN2 ( ( anything ) , NaN ) is NaN ;
* ATAN2 ( NAN , ( anything ) ) is NaN ;
* ATAN2 ( + - 0 , + ( anything but NaN ) ) is + - 0 ;
* ATAN2 ( + - 0 , - ( anything but NaN ) ) is + - pi ;
* ATAN2 ( + - ( anything but 0 and NaN ) , 0 ) is + - pi / 2 ;
* ATAN2 ( + - ( anything but INF and NaN ) , + INF ) is + - 0 ;
* ATAN2 ( + - ( anything but INF and NaN ) , - INF ) is + - pi ;
* ATAN2 ( + - INF , + INF ) is + - pi / 4 ;
* ATAN2 ( + - INF , - INF ) is + - 3 pi / 4 ;
* ATAN2 ( + - INF , ( anything but , 0 , NaN , and INF ) ) is + - pi / 2 ;
*
* Constants :
* The hexadecimal values are the intended ones for the following
* constants . The decimal values may be used , provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown .
*/
#include <float .h>
#include <math.h>
#include "math_private.h"
static volatile double
tiny = 1 .0 e-300 ;
static const double
zero = 0 .0 ,
pi_o_4 = 7 .8539816339744827900 E-01 , /* 0x3FE921FB, 0x54442D18 */
pi_o_2 = 1 .5707963267948965580 E+00 , /* 0x3FF921FB, 0x54442D18 */
pi = 3 .1415926535897931160 E+00 ; /* 0x400921FB, 0x54442D18 */
static volatile double
pi_lo = 1 .2246467991473531772 E-16 ; /* 0x3CA1A626, 0x33145C07 */
double
__ieee754_atan2(double y, double x)
{
double z;
int32_t k,m,hx,hy,ix,iy;
u_int32_t lx,ly;
EXTRACT_WORDS(hx,lx,x);
ix = hx&0 x7fffffff;
EXTRACT_WORDS(hy,ly,y);
iy = hy&0 x7fffffff;
if (((ix|((lx|-lx)>>31 ))>0 x7ff00000)||
((iy|((ly|-ly)>>31 ))>0 x7ff00000)) /* x or y is NaN */
return nan_mix(x, y);
if (hx==0 x3ff00000&&lx==0 ) return atan(y); /* x=1.0 */
m = ((hy>>31 )&1 )|((hx>>30 )&2 ); /* 2*sign(x)+sign(y) */
/* when y = 0 */
if ((iy|ly)==0 ) {
switch (m) {
case 0 :
case 1 : return y; /* atan(+-0,+anything)=+-0 */
case 2 : return pi+tiny;/* atan(+0,-anything) = pi */
case 3 : return -pi-tiny;/* atan(-0,-anything) =-pi */
}
}
/* when x = 0 */
if ((ix|lx)==0 ) return (hy<0 )? -pi_o_2-tiny: pi_o_2+tiny;
/* when x is INF */
if (ix==0 x7ff00000) {
if (iy==0 x7ff00000) {
switch (m) {
case 0 : return pi_o_4+tiny;/* atan(+INF,+INF) */
case 1 : return -pi_o_4-tiny;/* atan(-INF,+INF) */
case 2 : return 3 .0 *pi_o_4+tiny;/*atan(+INF,-INF)*/
case 3 : return -3 .0 *pi_o_4-tiny;/*atan(-INF,-INF)*/
}
} else {
switch (m) {
case 0 : return zero ; /* atan(+...,+INF) */
case 1 : return -zero ; /* atan(-...,+INF) */
case 2 : return pi+tiny ; /* atan(+...,-INF) */
case 3 : return -pi-tiny ; /* atan(-...,-INF) */
}
}
}
/* when y is INF */
if (iy==0 x7ff00000) return (hy<0 )? -pi_o_2-tiny: pi_o_2+tiny;
/* compute y/x */
k = (iy-ix)>>20 ;
if (k > 60 ) { /* |y/x| > 2**60 */
z=pi_o_2+0 .5 *pi_lo;
m&=1 ;
}
else if (hx<0 &&k<-60 ) z=0 .0 ; /* 0 > |y|/x > -2**-60 */
else z=atan(fabs(y/x)); /* safe to do y/x */
switch (m) {
case 0 : return z ; /* atan(+,+) */
case 1 : return -z ; /* atan(-,+) */
case 2 : return pi-(z-pi_lo);/* atan(+,-) */
default : /* case 3 */
return (z-pi_lo)-pi;/* atan(-,-) */
}
}
Messung V0.5 in Prozent C=73 H=100 G=87
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-08-26)
¤
*© Formatika GbR, Deutschland