From e6d64b939a78f3d18a34add5668e9364bcea83c4 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 8 Sep 2014 07:55:09 -0600 Subject: Correct atan2 implementations from Denis Arnst --- nuttx/libc/math/lib_atan2.c | 48 +++++++++++++++---------------------------- nuttx/libc/math/lib_atan2f.c | 48 +++++++++++++++---------------------------- nuttx/libc/math/lib_atan2l.c | 49 +++++++++++++++----------------------------- 3 files changed, 51 insertions(+), 94 deletions(-) (limited to 'nuttx/libc') diff --git a/nuttx/libc/math/lib_atan2.c b/nuttx/libc/math/lib_atan2.c index f78484d39..5f4a6bff0 100644 --- a/nuttx/libc/math/lib_atan2.c +++ b/nuttx/libc/math/lib_atan2.c @@ -41,46 +41,32 @@ #ifdef CONFIG_HAVE_DOUBLE double atan2(double y, double x) { - if (y == 0.0) + if (x > 0) { - if (x >= 0.0) - { - return 0.0; - } - else - { - return M_PI; - } + return atan(y / x); } - else if (y > 0.0) + else if (y >= 0 && x < 0) { - if (x == 0.0) - { - return M_PI_2; - } - else if (x > 0.0) - { - return atan(y / x); - } - else - { - return M_PI - atan(y / x); - } + return atan(y / x) + M_PI; } - else + else if (y < 0) { - if (x == 0.0) - { - return M_PI + M_PI_2; - } - else if (x > 0.0) + if (x == 0) { - return 2 * M_PI - atan(y / x); + return -M_PI_2; } - else + else /* Can only be x < 0 */ { - return M_PI + atan(y / x); + return atan(y / x) - M_PI; } } + else if (y > 0 && x == 0) + { + return M_PI_2; + } + else if (y == 0 && x == 0) /* Undefined but returns normally 0 */ + { + return 0; + } } #endif diff --git a/nuttx/libc/math/lib_atan2f.c b/nuttx/libc/math/lib_atan2f.c index f3a92ff53..999edd6ee 100644 --- a/nuttx/libc/math/lib_atan2f.c +++ b/nuttx/libc/math/lib_atan2f.c @@ -37,45 +37,31 @@ float atan2f(float y, float x) { - if (y == 0.0) + if (x > 0) { - if (x >= 0.0) - { - return 0.0; - } - else - { - return M_PI; - } + return atanf(y / x); } - else if (y > 0.0) + else if (y >= 0 && x < 0) { - if (x == 0.0) - { - return M_PI_2; - } - else if (x > 0.0) - { - return atanf(y / x); - } - else - { - return M_PI - atanf(y / x); - } + return atanf(y / x) + M_PI; } - else + else if (y < 0) { - if (x == 0.0) - { - return M_PI + M_PI_2; - } - else if (x > 0.0) + if (x == 0) { - return 2 * M_PI - atanf(y / x); + return -M_PI_2; } - else + else /* Can only be x < 0 */ { - return M_PI + atanf(y / x); + return atanf(y / x) - M_PI; } } + else if (y > 0 && x == 0) + { + return M_PI_2; + } + else if (y == 0 && x == 0) /* Undefined but returns normally 0 */ + { + return 0; + } } diff --git a/nuttx/libc/math/lib_atan2l.c b/nuttx/libc/math/lib_atan2l.c index e2a576e58..1946a3f04 100644 --- a/nuttx/libc/math/lib_atan2l.c +++ b/nuttx/libc/math/lib_atan2l.c @@ -41,47 +41,32 @@ #ifdef CONFIG_HAVE_LONG_DOUBLE long double atan2l(long double y, long double x) { - - if (y == 0.0) + if (x > 0) { - if (x >= 0.0) - { - return 0.0; - } - else - { - return M_PI; - } + return atanl(y / x); } - else if (y > 0.0) + else if (y >= 0 && x < 0) { - if (x == 0.0) - { - return M_PI_2; - } - else if (x > 0.0) - { - return atanl(y / x); - } - else - { - return M_PI - atanl(y / x); - } + return atanl(y / x) + M_PI; } - else + else if (y < 0) { - if (x == 0.0) - { - return M_PI + M_PI_2; - } - else if (x > 0.0) + if (x == 0) { - return 2 * M_PI - atanl(y / x); + return -M_PI_2; } - else + else /* Can only be x < 0 */ { - return M_PI + atanl(y / x); + return atanl(y / x) - M_PI; } } + else if (y > 0 && x == 0) + { + return M_PI_2; + } + else if (y == 0 && x == 0) /* Undefined but returns normally 0 */ + { + return 0; + } } #endif -- cgit v1.2.3