CORDIC为平方根

时间:2013-09-05 21:17:03

标签: c++ cordic

我一直在以双曲线旋转模式查看CORDIC算法,以找到变量的平方根。我不确定我的初始变量应该是什么(x0,y0,z0)才能找到 平方根。我已经阅读了一些论文,引用要找到sqrt(a),初始值应分别设置为+ 1,a-1,0分别为x0,y0和z0。其他人说它应该是+ 0.25,a-0.25,0。我很困惑这个

有人可以帮忙吗?

double x = (64.0+1);
double y = (64.0-1);
double z = 0; 


double k = 3;
double n = 1;
while(n <= 20 ){

    double xn = pow(2.0,-1.0*n) * x;
    double yn = pow(2.0,-1.0*n) * y;

    if(y < 0){ 
        x = x + xn;
        y = y + yn;
        z = z - atanh(pow(2.0,-1.0*n));
    }
    else
    {
        x = x - xn;
        y = y - yn;
        z = z + atanh(pow(2.0,-1*n));

    }

    if(k > 0){
        k = k-1;
    }
    else{
        k = 3;
        if(y < 0){ 
            x = x + xn;
            y = y + yn;
            z = z - atanh(pow(2.0,-1.0*n));
        }
        else
        {
            x = x - xn;
            y = y - yn;
            z = z + atanh(pow(2.0,-1.0*n));

        }
    }
    n++;
    cout << "x: " << x << " y: " << y << " z: " << z << endl;
}

编辑* 除了补偿3j + 1次重复之外,CORDIC还需要在n = 4,13,40等实例中执行两次循环...我已经更新了我的代码来补偿它,但它仍然不起作用。 我在矢量化模式下使用双曲线旋转,变量d应该基于y的符号

编辑* 事实证明,CORDIC在计算较大的平方根值时可能会失败,因此您必须将您尝试找到0.5到2范围的平方根的数量标准化,然后缩小回答。

3 个答案:

答案 0 :(得分:2)

  对于x0,y0和z0,

初始值应分别设置为+ 1,a-1,0。其他人说它应该是+ 0.25,a-0.25,0。我很困惑这个

最终结果为sqrt((a+1)^2 - (a-1)^2)sqrt((a+0.25)^2 - (a-0.25)^2)。无论哪种方式,a^2条款取消,常数条款取消。唯一的区别是第一个版本返回sqrt(4a)2sqrt(a),第二个版本直接返回sqrt(a)。我不知道为什么一个案例或另一个案例可能是首选的数字原因。

修改:您的错误是基于d设置y,它应该基于z

答案 1 :(得分:2)

您应该将执行平方根的数量标准化为[0.5,2]范围,然后相应地缩放。

答案 2 :(得分:0)

代码中有几个错误!

  1. 不交换变量。
     x = x + xn;
     y = y + yn;

应为:

     x = x + yn;
     y = y + xn;
  1. 没有正确重复迭代4和13。 在这些分支中需要重新计算以下内容:
     xn = pow(2.0,-1.0*n) * y;
     yn = pow(2.0,-1.0*n) * x;
  1. 应在输出(x/2*1.207497)上进行比例校正。

请参见此处,了解调试错误但有效的代码: https://godbolt.org/z/ma4dCV

还请注意,不需要整个z频道(https://mathworks.com/help/fixedpoint/examples/compute-square-root-using-cordic.html)。