Simplifying fast_atan2f()
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 11 May 2016 23:17:50 +0000 (19:17 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Sun, 17 Jul 2016 19:05:54 +0000 (15:05 -0400)
src/analysis.c

index a771324..6b6fb44 100644 (file)
@@ -115,26 +115,20 @@ static const int extra_bands[NB_TOT_BANDS+1] = {
 #define cE ((float)M_PI/2)
 static OPUS_INLINE float fast_atan2f(float y, float x) {
    float x2, y2;
-   /* Should avoid underflow on the values we'll get */
-   if (ABS16(x)+ABS16(y)<1e-9f)
-   {
-      x*=1e12f;
-      y*=1e12f;
-   }
    x2 = x*x;
    y2 = y*y;
+   /* For very small values, we don't care about the answer, so
+      we can just return 0. */
+   if (x2 + y2 < 1e-18f)
+   {
+      return 0;
+   }
    if(x2<y2){
       float den = (y2 + cB*x2) * (y2 + cC*x2);
-      if (den!=0)
-         return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE);
-      else
-         return (y<0 ? -cE : cE);
+      return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE);
    }else{
       float den = (x2 + cB*y2) * (x2 + cC*y2);
-      if (den!=0)
-         return  x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE);
-      else
-         return (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE);
+      return  x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE);
    }
 }