Thursday 15 August 2013

java - What's wrong with my CORDIC algorithm? -


optimized for Java:

  class MathFunctions {final static double [] angle = {0.78539816339745, 0.46364760900081, 0.24497866312686, 0.12435499454676, 0.06241880999596, 0.03123983343027, 0.01562372862048, 0.00781234106010, 0.00390623013197, 0.00195312251648, 0.00097656218956, 0.00048828121119, 0.00024414062015, 0.00012207031189, 0.00006103515617, 0.00003051757812. 00001525878906, 0.00000762939453, 0.00000381469727, 0.00000190734863, 0.00000095367432, 0.00000047683716, 0.00000023841858, 0.00000011920929, 0.00000005960464, 0.00000002980232, 0.00000001490116, 0.00000000745058}; Last Fixed Double [] Kvalues ​​= {.70710678118655, .63245553203368, .60883391251775, .60764825625617, .60735177014130, .60727764409353, .60725447933256, .60725332108988, .60725303152913, .60725295913894, .60725294104140,. 60725293651701, 0.60725293538591, 0.60725293510314, 0.60725293503245, 0.60725293501477, 0.60725293501035, 0.60725293500925, 0.60725293500897, 0.60725293500890, 0.60725293500889, 0.60725293500888}; Public stable double [] cordic (double theta, int n) {double] V = new double [2]; If (theta and lieutenant; -mooth.pi/2 || theta; Math.pi / 2) {v = (theta and lt; 0)? Cordic (theta + math.pi, n): chordic (theta-monastery, pi, n); New double return [] {- ​​V [0], - V [1]}; } Double angle = angle [0], know = qalives [Math.man (n, lengthwise -1)]; Double sigma, factor, powerhofft = 1; For (int i = 0; i & lt; n-1; i ++) {sigma = (theta  angle)? Angle 2: angle [i + 2]; } New double return [] {v [0] * no, v [1] * na;}; }}   

I just PI because tested the code with this:

  Double cosPI = MathFunctions.cordic ( Mathematics.pi, 8) [0]; System.out.printf ("cos (PI) =% f% n", cpsi);   

And for some reason it has given me instead of -0.0 -1 .

The short answer is that the upgrade did not start properly V vector address below. Note that it is still not very right on Java.

  class MathFunctions {final static double [] angle = {0.78539816339745d, 0.46364760900081d, 0.24497866312686d, 0.12435499454676d, 0.06241880999596d, 0.03123983343027d, 0.01562372862048d, 0.00781234106010d, 0.00390623013197d, 0.00195312251648d , 0.00097656218956d, 0.00048828121119d, 0.00024414062015d, 0.00012207031189d, 0.00006103515617d, 0.00003051757812d, 0.00001525878906d, 0.00000762939453d, 0.00000381469727d, 0.00000190734863d, 0.00000095367432d, 0.00000047683716d, .00000023841858 d, 0.00000011920929d, 0.00000005960464d, 0.00000002980232d, 0.00000001490116d, 0.00000000745058d}; Last stable double [] Kvalues ​​= {0.70710678118655d, 0.63245553203368d, 0.61357199107790d, 0.60883391251775d, 0.60764825625617d, 0.60735177014130d, 0.60727764409353d, 0.60725911229889d, 0.60725447933256d, 0.60725332108988d, 0.60725303152913d, 0.60725295913894d, 0.60725294104140d, 0.60725293651701 D, 0.60725293538591d, 0.60725293510314d, 0.60725293503245d, 0.60725293501477d, 0.60725293501035d, 0.60725293500925d, 0.60725293500897d, 0.60725293500890d, 0.60725293500889d, 0.60725293500888d}; Public static double [] cordic (double live, int n) {double [V]; If (theta and lieutenant; -mooth.pi/2 || theta; Math.pi / 2) {v = (theta and lt; 0)? Cordic (theta + math.pi, n): chordic (theta-monastery, pi, n); New double return [] {- ​​V [0], - V [1]}; } // You did not start V properly v = new double [] {1.0d, 0,}; Double angle = angle [0], know = qualivus [mon.en (n, qualives length-1)]; Double sigma, factor, powerhofft = 1; For (int i = 0; i & lt; n; i ++) {sigma = (theta <0)? -1 1; Factor = sigma * power soft wo; V = new double [] {v [0] - v [1] * factor, v [0] * factor + v [1]}; Theta - = sigma * angle; Poweroftwo / = 2; Angle = (i + 2> angle)? Angle 2: angle [i + 2]; } New double return [] {v [0] * no, v [1] * na;}; } Public static zero main (string [] args) {double [] value; Value = math function. Cordic (Math, PI, 8); System.out.printf ("cos (PI) =% f, sin (PI) =% f% n", value [0], value [1]); Value = math function. Cordic (Math.PI / 2, 8); System.out.printf ("cos (PI / 2) =% f, sin (PI / 2) =% F% n", value [0], value [1]); Value = math function. Chordic (0, 15); System.out.printf ("cos (0) =% f, sin (0) =% f% n", value [0], value [1]); }}    

No comments:

Post a Comment