add hi-perf notes on ATAN/ATAN2
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 13 Aug 2019 19:26:30 +0000 (20:26 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 13 Aug 2019 19:26:30 +0000 (20:26 +0100)
ztrans_proposal.mdwn

index 70d9247cc820e9b272a4bfad9f636bac1d78ba7b..0e192a0d9777431e773a0bd413ade7271841bcd0 100644 (file)
@@ -275,3 +275,24 @@ one can then do high precision multiplies of  π or other transcendental
 radixes.
 
 And GPUs have been doing this almost since the dawn of 3D.
+
+    // calculate ATAN2 high performance style
+    // Note: at this point x != y
+    //
+    if( x  > 0.0             )
+    {
+        if( y < 0.0 && |y| < |x| ) return - π/2 - ATAN( x / y );
+        if( y < 0.0 && |y| > |x| ) return       + ATAN( y / x );
+        if( y > 0.0 && |y| < |x| ) return       + ATAN( y / x );
+        if( y > 0.0 && |y| > |x| ) return + π/2 - ATAN( x / y );
+    }
+    if( x  < 0.0             )
+    {
+        if( y < 0.0 && |y| < |x| ) return + π/2 + ATAN( x / y );
+        if( y < 0.0 && |y| > |x| ) return + π   - ATAN( y / x );
+        if( y > 0.0 && |y| < |x| ) return + π   - ATAN( y / x );
+        if( y > 0.0 && |y| > |x| ) return +3π/2 + ATAN( x / y );
+    }
+
+This way the adds and subtracts from the constant are not in a precision
+precarious position.