CORDIC 알고리즘 계산기
곱셈 없이 시프트와 덧셈만으로 sin·cos를 구하는 CORDIC의 반복 과정을 단계별로 보여 줍니다. 각 단계의 회전각 arctan(2⁻ⁱ)과 이득 K = 0.6072529, 곱해 주지 않았을 때 생기는 1.6468배 오류까지 함께 냅니다.
한 번에 대략 1비트씩 정확해집니다. 16번이면 소수점 아래 다섯 자리쯤.
12번 돌린 결과
cos 0.86591128 · sin 0.50019761
표준 라이브러리 값과 0 차이 · 곱셈은 한 번도 쓰지 않았습니다
단계별로 따라가기
| i | αᵢ = arctan(2⁻ⁱ) | 방향 | x | y | 남은 각 z |
|---|---|---|---|---|---|
| 0 | 45° | + | 1 | 1 | -0.2617994 |
| 1 | 26.5651° | − | 1.5 | 0.5 | 0.2018482 |
| 2 | 14.0362° | + | 1.375 | 0.875 | -0.0431304 |
| 3 | 7.125° | − | 1.484375 | 0.703125 | 0.0812246 |
| 4 | 3.5763° | + | 1.4404297 | 0.7958984 | 0.0188057 |
| 5 | 1.7899° | + | 1.4155579 | 0.8409119 | -0.0124341 |
| 6 | 0.8952° | − | 1.4286971 | 0.8187938 | 0.0031896 |
| 7 | 0.4476° | + | 1.4223003 | 0.8299555 | -0.0046227 |
| 8 | 0.2238° | − | 1.4255423 | 0.8243996 | -0.0007165 |
| 9 | 0.1119° | − | 1.4271525 | 0.8216153 | 0.0012366 |
| 10 | 0.056° | + | 1.4263501 | 0.8230091 | 0.0002601 |
| 11 | 0.028° | + | 1.4259482 | 0.8237055 | -0.0002282 |
x와 y는 이득을 곱하기 전의 값입니다. 마지막 x·y에 K = 0.60725296을 곱하면 cos·sin이 됩니다. 표의 마지막 x·y가 1보다 크게 나오는 것이 그 때문입니다.
반복 횟수와 오차
| n | cos | 오차 | 맞은 자릿수 |
|---|---|---|---|
| 1 | 0.707106781 | 0.207 | 0.7 |
| 2 | 0.948683298 | 0.184 | 0.7 |
| 3 | 0.843661488 | 0.037 | 1.4 |
| 4 | 0.903737839 | 0.072 | 1.1 |
| 5 | 0.875274588 | 0.016 | 1.8 |
| 6 | 0.859741573 | 0.011 | 2 |
| 7 | 0.867615815 | 0.003 | 2.6 |
| 8 | 0.863704807 | 0.004 | 2.4 |
| 9 | 0.865666945 | 0.001 | 3.2 |
| 10 | 0.866643066 | 0.001 | 3 |
| 11 | 0.866155418 | 0 | 3.6 |
| 12 | 0.865911284 | 0 | 3.7 |
| 13 | 0.866033377 | 0 | 4.9 |
| 14 | 0.865972337 | 0 | 4 |
| 15 | 0.866002859 | 0 | 4.4 |
| 16 | 0.866018118 | 0 | 4.9 |
| 17 | 0.866025748 | 5.957 ×10^-7 | 6.2 |
| 18 | 0.866021933 | 0 | 5.2 |
| 19 | 0.86602384 | 0 | 5.6 |
| 20 | 0.866024794 | 0 | 6 |
사용 방법
- 1각도를 넣고 반복 횟수를 정합니다. 16번이면 소수점 아래 다섯 자리쯤까지 맞습니다.
- 2단계별 표에서 남은 각 z가 어떻게 0에 다가가는지, x와 y가 어떻게 cos·sin이 되는지 봅니다.
- 3「이득 K를 곱하지 않으면」 줄에서 값이 1.6468배로 나오는 것을 확인합니다.
- 4아래 수렴 표에서 반복 횟수를 늘렸을 때 오차가 한 번에 한 비트씩 줄어드는 것을 봅니다.
자주 묻는 질문
회전각으로 arctan(2⁻ⁱ)만 쓰기 때문입니다. 회전행렬을 x cos α − y sin α = cos α · (x − y tan α)로 정리하면 tan α = 2⁻ⁱ일 때 곱셈이 오른쪽 시프트 i번이 됩니다. 남는 cos α는 어느 방향으로 돌든 같은 값이라 매 단계 곱하지 않고 맨 끝에 한 번만 처리합니다.
매 단계 생략한 cos α들을 모두 곱한 값으로 K = Π cos(arctan 2⁻ⁱ) = 0.6072529350088813입니다. 이것을 곱해 주지 않으면 결과가 1/K = 1.6467602581210654배로 나옵니다. 첫 구현에서 가장 흔히 걸리는 자리이며, 결과가 단위원이 아니라 반지름 1.6468인 원 위에 놓입니다.
결과에 곱해도 되고 처음부터 x₀ = K로 시작해도 됩니다. 하드웨어에서는 뒤엣것을 씁니다 — 곱셈을 없애자고 만든 알고리즘인데 마지막에 곱셈이 하나 남으면 곤란하므로, K를 상수로 미리 넣어 두면 곱셈이 한 번도 나오지 않습니다.
한 번에 대략 1비트씩 정확해지므로 원하는 정밀도의 비트 수만큼 돌리면 됩니다. n번 돌리면 남는 각이 arctan(2^−(n−1)) 이하이기 때문입니다. 16비트 고정소수점이면 16번, 배정밀도 실수의 한계까지 가려면 30번쯤 필요합니다.
모든 회전각을 더한 ±1.7432866 라디안, 곧 ±99.88297도입니다. 그보다 큰 각은 만들 수 없으므로 먼저 사분면을 옮겨야 합니다. 각을 −180~180도로 줄인 뒤 90도를 넘으면 180도를 빼거나 더하고 부호를 뒤집으면 남는 각이 반드시 90도 이하라 범위 안에 듭니다.
무관하지 않습니다. n단계까지의 곱만 써야 하며, 반복이 적은데 무한 곱의 값을 쓰면 그만큼 어긋납니다. 1번이면 0.7071, 2번이면 0.6325, 3번이면 0.6136이고 10번쯤부터 극한값과 소수점 다섯째 자리까지 같아집니다.
곱셈이 필요한지가 다릅니다. 테일러 급수는 거듭제곱과 나눗셈이 들어가 곱셈기가 있어야 빠르고, CORDIC은 시프트와 덧셈만으로 돌아가 곱셈기가 없는 하드웨어에서 이깁니다. 대신 CORDIC은 한 번에 1비트씩만 좋아져 반복 횟수가 비트 수만큼 필요합니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- 여기서는 배정밀도 실수로 계산합니다. 실제 하드웨어는 고정소수점이라 2⁻ⁱ 곱하기가 진짜 시프트가 됩니다.
- 고정소수점에서는 자릿수가 유한해 반복을 늘려도 어느 지점부터는 좋아지지 않습니다.
- 회전 모드(각 → sin·cos)만 다룹니다. 벡터링 모드(좌표 → 각·크기)는 범위 밖입니다.
- 이득 K는 반복 횟수까지의 곱을 씁니다. 무한 곱의 값을 쓰면 반복이 적을 때 어긋납니다.
- 수렴 범위는 ±99.88297도입니다. 그 밖은 사분면을 먼저 옮깁니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.