Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';我的CORDIC算法有什么问题?_Java_Cordic - Fatal编程技术网

Java 什么';我的CORDIC算法有什么问题?

Java 什么';我的CORDIC算法有什么问题?,java,cordic,Java,Cordic,从以下方面改编为Java: 出于某种原因,它给了我-0.0而不是-1简单的回答是没有正确初始化v向量。更新代码如下。注意,在java上这仍然不是很准确 class MathFunctions { final static double[] angles = { 0.78539816339745d, 0.46364760900081d, 0.24497866312686d, 0.12435499454676d, 0.06241880999596d, 0.031239833430

从以下方面改编为Java:


出于某种原因,它给了我
-0.0
而不是
-1

简单的回答是没有正确初始化v向量。更新代码如下。注意,在java上这仍然不是很准确

class MathFunctions {
  final static double[] angles = {
    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, 0.00000023841858d, 0.00000011920929d,
    0.00000005960464d, 0.00000002980232d, 0.00000001490116d, 0.00000000745058d};
  final static 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.60725293651701d, 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 theta, int n) {
    double[] v;
    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]};
    }
    // You didn't initialise v properly
    v = new double[] {1.0d, 0, };
    double angle=angles[0], Kn=Kvalues[Math.min(n, Kvalues.length-1)];
    double sigma, factor, poweroftwo=1;
    for (int i=0; i<n; 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};
  }

  public static void main(String[] args)
  {
    double[] values;
    values = MathFunctions.cordic(Math.PI, 8);
    System.out.printf("cos(PI)   = %f, sin(PI)   = %f%n",values[0], values[1]);
    values = MathFunctions.cordic(Math.PI/2, 8);
    System.out.printf("cos(PI/2) = %f, sin(PI/2) = %f%n",values[0], values[1]);
    values = MathFunctions.cordic(0, 15);
    System.out.printf("cos(0)    = %f, sin(0)    = %f%n",values[0], values[1]);
  }
}
类函数{
最终静态双[]角={
0.78539816339745d、0.46364760900081d、0.24497866312686d、0.12435499454676d、,
0.06241880959596D、0.03123983343027d、0.01562372862048d、0.00781234106010d、,
0.00390623013197d、0.00195312251648d、0.00097656218956d、0.0004882812119D、,
0.00024414062015d、0.000122070189D、0.00006103515617d、0.00003051757812d、,
0.00001525878906d、0.0000762939453D、0.00000381469727d、0.00000190734863d、,
0.00000095367432d、0.00000047683716d、0.00000023841858d、0.00000011920929d、,
0.00000005960464d、0.000000029802322D、0.00000001490116d、0.00000000745058d};
最终静态双[]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.60725293651701d、0.60725293538591d、0.60725293510314d、,
0.60725293503245d、0.60725293501477d、0.60725293501035d、0.60725293500925d、,
0.60725293500897d、0.60725293500890d、0.60725293500889d、0.60725293500888d};
公共静态双[]cordic(双θ,整数n){
双[]v;
if(theta<-Math.PI/2 | | theta>Math.PI/2){
v=(θ<0)?cordic(θ+数学π,n):cordic(θ-数学π,n);
返回新的双精度[]{-v[0],-v[1]};
}
//你没有正确初始化v
v=新的双精度[]{1.0d,0,};
双角度=角度[0],Kn=Kvalues[数学最小值(n,Kvalues.length-1)];
双西格玛,因子,幂函数=1;
对于(int i=0;i角度.长度)?角度/2:角度[i+2];
}
返回新的双精度[]{v[0]*Kn,v[1]*Kn};
}
公共静态void main(字符串[]args)
{
双[]值;
values=MathFunctions.cordic(Math.PI,8);
System.out.printf(“cos(PI)=%f,sin(PI)=%f%n”,值[0],值[1]);
values=MathFunctions.cordic(Math.PI/2,8);
System.out.printf(“cos(PI/2)=%f,sin(PI/2)=%f%n”,值[0],值[1]);
值=MathFunctions.cordic(0,15);
System.out.printf(“cos(0)=%f,sin(0)=%f%n”,值[0],值[1]);
}
}

代码仍然有一个主要错误。代码

angle = (i+2 > angles.length)? angle/2 : angles[i+2];
应该是

angle = (i+2 > angles.length)? angle/2 : angles[i+1];

我建议添加日志记录/输出,以检查初始缩减是否正确完成。如果是,我会尝试更多[-pi/2,pi/2]范围内的值来描述问题。@PatriciaShanahan假设wiki示例是正确的,从它转换成这个,最让我担心的是矩阵乘法,我将其翻译为
v[0]-v[1]*因子,v[0]*因子+v[1]
。我想知道是否有人会抓住它。你在mathlab中尝试过这个例子吗?@koem没有,我没有mathlab(而且从未使用过它)
angle = (i+2 > angles.length)? angle/2 : angles[i+2];
angle = (i+2 > angles.length)? angle/2 : angles[i+1];