변수의 제곱근을 찾기 위해 쌍곡선 회전 모드에서 CORDIC 알고리즘을 살펴 보았습니다. 내 초기 변수가 제곱근을 찾으려면 (x0, y0, z0) 무엇인지 확신 할 수 없습니다. 나는 sqrt (a)를 찾기 위해 초기 값을 각각 x0, y0, z0에 대해 +1, a-1,0로 설정해야한다고 언급 한 논문을 읽었습니다. 다른 사람들은 + 0.25, -0.25,0이어야한다고 말합니다. 나는 이것으로 매우 혼란 스럽다.제곱근에 대한 CORDIC
아무도 도와 줄 수 있습니까? 3J + 1 반복에 대한 보상과 함께
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;
}
EDIT * 은 CORDIC는 N = 4,13,40 같은 경우에 두 루프를 실행할 필요 ... I는 보상하려면 코드를 업데이트 ,하지만 여전히 작동하지 않습니다. 나는 변수 d
는 Y의 기호에 기초해야 벡터링 모드에서 쌍곡선 회전을 사용하고
EDIT * 큰 제곱근 값을 계산할 때 당신은 당신이 수를 정상화 할 수 있도록 CORDIC이 실패 할 수 있음을 밝혀 0.5에서 2 범위의 제곱근을 찾으려고 시도한 다음 다시 백 업 응답을 확장합니다.
관련없는 의견 : 나는 CORDIC이 30 년 이상 언급 한 것을 들어 보지 못했습니다. 그것은 1968 년경의 HP 9100 탁상용 계산기의 기초 였고, 회로 화 된 후에 HP의 원래 계산기 계산기 라인이되었습니다. (알고리즘에 대해서는 거의 알지 못하지만, 다이오드 어레이 ROM에 의해 정의 된 것 외에는 계산기 바닥을 채우는 거의 18 인치의 사각형 회로 기판을 사용했다.) –
오늘날의 FPGA는 여전히 그것을 사용한다 – DashControl
I 나는 약간 놀랐다. IIRC는 특히 빠르지는 않았지만 사실상 모든 초월 기능이 동일한 기본, 매우 간단한 프레임 워크, 다른 매개 변수로 구현 될 수 있다는 이점이있었습니다. –