CORDIC のウィキペディア ページから Java に適応:
class MathFunctions {
final static double[] angles = {
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,
0.00001525878906, 0.00000762939453, 0.00000381469727, 0.00000190734863,
0.00000095367432, 0.00000047683716, 0.00000023841858, 0.00000011920929,
0.00000005960464, 0.00000002980232, 0.00000001490116, 0.00000000745058};
final static double[] Kvalues = {
0.70710678118655, 0.63245553203368, 0.61357199107790, 0.60883391251775,
0.60764825625617, 0.60735177014130, 0.60727764409353, 0.60725911229889,
0.60725447933256, 0.60725332108988, 0.60725303152913, 0.60725295913894,
0.60725294104140, 0.60725293651701, 0.60725293538591, 0.60725293510314,
0.60725293503245, 0.60725293501477, 0.60725293501035, 0.60725293500925,
0.60725293500897, 0.60725293500890, 0.60725293500889, 0.60725293500888};
public static double[] cordic(double theta, int n) {
double[] v = new double[2];
if (theta < -Math.PI/2 || theta > Math.PI/2) {
v = (theta < 0)? cordic(theta + Math.PI, n):cordic(theta - Math.PI, n);
return new double[]{-v[0],-v[1]};
}
double angle=angles[0], Kn=Kvalues[Math.min(n, Kvalues.length-1)];
double sigma, factor, poweroftwo=1;
for (int i=0; i<n-1; i++) {
sigma = (theta < 0)? -1 : 1;
factor = sigma*poweroftwo;
v = new double[]{v[0] - v[1]*factor, v[0]*factor + v[1]};
theta -= sigma*angle;
poweroftwo /= 2;
angle = (i+2 > angles.length)? angle/2 : angles[i+2];
}
return new double[]{v[0]*Kn, v[1]*Kn};
}}
次のようにコードをテストしましたcos PI
:
double cosPI = MathFunctions.cordic(Math.PI, 8)[0];
System.out.printf("cos(PI) = %f%n",cosPI);
そして、何らかの理由で、-0.0
代わりに私に与えました-1
。