⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atan2.c

📁 早期freebsd实现
💻 C
字号:
/*- * Copyright (c) 1990, 1993 *	The Regents of the University of California.  All rights reserved. * * This code is derived from software contributed to Berkeley by * the Systems Programming Group of the University of Utah Computer * Science Department. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)atan2.c	8.1 (Berkeley) 6/4/93";#endif /* not lint *//* * ATAN2(Y,X) * RETURN ARG (X+iY) * DOUBLE PRECISION (IEEE DOUBLE 53 BITS) * * Scaled down version to weed out special cases.  "Normal" cases are * handled by calling atan2__A(), an assembly coded support routine in * support.s. * * Required system supported functions : *	copysign(x,y) *	atan2__A(y,x) *	 * Method : *	1. Deal with special cases *	2. Call atan2__A() to do the others * * Special cases: * Notations: atan2(y,x) == ARG (x+iy) == ARG(x,y). * *	ARG( NAN , (anything) ) is NaN; *	ARG( (anything), NaN ) is NaN; *	ARG(+(anything but NaN), +-0) is +-0  ; *	ARG(-(anything but NaN), +-0) is +-PI ; *	ARG( 0, +-(anything but 0 and NaN) ) is +-PI/2; *	ARG( +INF,+-(anything but INF and NaN) ) is +-0 ; *	ARG( -INF,+-(anything but INF and NaN) ) is +-PI; *	ARG( +INF,+-INF ) is +-PI/4 ; *	ARG( -INF,+-INF ) is +-3PI/4; *	ARG( (anything but,0,NaN, and INF),+-INF ) is +-PI/2; * * Accuracy: *	atan2(y,x) returns (PI/pi) * the exact ARG (x+iy) nearly rounded,  *	where * *	in decimal: *		pi = 3.141592653589793 23846264338327 .....  *    53 bits   PI = 3.141592653589793 115997963 ..... , *    56 bits   PI = 3.141592653589793 227020265 ..... ,   * *	in hexadecimal: *		pi = 3.243F6A8885A308D313198A2E.... *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18	error=.276ulps *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2    error=.206ulps *	 *	In a test run with 356,000 random argument on [-1,1] * [-1,1] on a *	VAX, the maximum observed error was 1.41 ulps (units of the last place) *	compared with (PI/pi)*(the exact ARG(x+iy)). * * Note: *	We use machine PI (the true pi rounded) in place of the actual *	value of pi for all the trig and inverse trig functions. In general,  *	if trig is one of sin, cos, tan, then computed trig(y) returns the  *	exact trig(y*pi/PI) nearly rounded; correspondingly, computed arctrig  *	returns the exact arctrig(y)*PI/pi nearly rounded. These guarantee the  *	trig functions have period PI, and trig(arctrig(x)) returns x for *	all critical values x. *	 * 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. */static double PIo4   =  7.8539816339744827900E-1    , /*Hex  2^ -1   *  1.921FB54442D18 */PIo2   =  1.5707963267948965580E0     , /*Hex  2^  0   *  1.921FB54442D18 */PI     =  3.1415926535897931160E0     ; /*Hex  2^  1   *  1.921FB54442D18 */double atan2(y,x)double  y,x;{  	static double zero=0, one=1;	double copysign(),atan2__A(),signy,signx;	int finite();    /* if x or y is NAN */	if(x!=x) return(x); if(y!=y) return(y);    /* copy down the sign of y and x */	signy = copysign(one,y);	signx = copysign(one,x);    /* when y = 0 */	if(y==zero) return((signx==one)?y:copysign(PI,signy));    /* when x = 0 */	if(x==zero) return(copysign(PIo2,signy));	        /* when x is INF */	if(!finite(x))	    if(!finite(y)) 		return(copysign((signx==one)?PIo4:3*PIo4,signy));	    else		return(copysign((signx==one)?zero:PI,signy));    /* when y is INF */	if(!finite(y)) return(copysign(PIo2,signy));    /* else let atan2__A do the work */	return(atan2__A(y,x));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -