atan2f.c 1.27 KB
/*
=============================================================================
        Copyright (C) 1997-1999 NINTENDO Co.,Ltd.
        
        $RCSfile: atan2f.c,v $
        $Revision: 1.1.1.1 $
        $Date: 2002/10/30 02:07:09 $
=============================================================================
関数名:atan2f
-----------------------------------------------------------------------------
書式:  #include <math.h>
        float atan2f(float y, float x);
引数:  x 
        y 
戻り値:引数 y÷引数 xのアークタンジェントを返す
説明:  引数 y÷引数 xのアークタンジェントを返す

        atan(t) = t / (1+(t^2/(3+(2^2*t^2/(5+(3^2*t^2/(7+....)))))))
-----------------------------------------------------------------------------
*/
#include "math.h"

float atan2f(float y, float x)
{
    float   xx, z;
    float   a;
    int     i;

    if (x==0 && y==0) return FVAL_ZERO;
    if (x==0) {
        if (y>0) return FVAL_PI/2;
        else return -FVAL_PI/2;
    }

    xx = y/x;
    if (fabsf(xx)<=1) z = xx;
    else z = 1/xx;
    a = 0;
    for (i=14; i>=1; i--) a = i*i*z*z/(1+2*i+a);
    z = z/(1+a);
    if (xx> 1) z = FVAL_PI/2 - z;
    if (xx<-1) z = -FVAL_PI/2 - z;

    if (x>0) return z;
    else {
        if (y>0) return z+FVAL_PI;
        else return z-FVAL_PI;
    }
}