我一直在以双曲线旋转模式查看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范围的平方根的数量标准化,然后缩小回答。
答案 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)
代码中有几个错误!
x = x + xn;
y = y + yn;
应为:
x = x + yn;
y = y + xn;
xn = pow(2.0,-1.0*n) * y;
yn = pow(2.0,-1.0*n) * x;
x/2*1.207497
)上进行比例校正。请参见此处,了解调试错误但有效的代码: https://godbolt.org/z/ma4dCV
还请注意,不需要整个z
频道(https://mathworks.com/help/fixedpoint/examples/compute-square-root-using-cordic.html)。