| 三角学 |
| --- |
|  |
| * 历史（英语：）
* 三角函数 (反三角函数)
* 广义三角函数（英语：）
 |
| 
参考 |
| * 恒等式
* 精确值
* 三角表（英语：）
* 单位圆
 |
| 
定理 |
| * 正弦
* 餘弦
* 正切
* 餘切
* 勾股定理
 |
| 微积分 |
| * 三角换元法
* 积分 (反三角函数)
* 微分
 |
| * 
* 论
* 编
 |

**CORDIC**（全稱為coordinate rotation digital computer），也稱為**Volder演算法**，是一個可以計算三角函數，簡單且有效率的演算法，可以在任意進制下運算，一般會每次計算一位數字。因此CORDIC 是Digit-by-digit方法中的一個例子。

CORDIC演算法還有其他的名稱，像是**圓形CORDIC** (Jack E. Volder)、**線性CORDIC**、**雙曲線CORDIC**(John Stephen Walther)、及**泛用雙曲線CORDIC**（GH CORDIC, Yuanyong Luo et al.）。用類似的方式也可以計算雙曲函數、平方根、乘法、除法、指數及對數等。

CORDIC和一些名為「偽乘法」（pseudo-multiplication）、「偽除法」（pseudo-division）及factor combining的方法，常用在沒有乘法器的應用（像是簡單的微控制器以及FPGA），其中會用到的運算是加法、減法、位元移位及查找表。這些算法可歸類在「移位和相加」（shift-and-add）演算法中。在計算機科學中，若CPU沒有硬體的乘法器，常會用CORDIC來實現浮点数运算。

歷史
--

英國數學家亨利·布里格斯（英语：）早在1624年時就已發現此算法，後來Robert Flower也在1771年時發現，不過後來是因為低複雜度的有限狀態CPU，才針對CORDIC作較進一步的最佳化。

CORDIC是在1956年問世，是由康维尔空氣電子部門的Jack E. Volder（英语：）發現，一開始是因為要取代B-58轟炸機（英语：）導航電腦上面的類比式解角器（resolver），更換成更準確而實時的數位方案。因此，有時也會將CORDIC稱為數位解角器（digital resolver）。

Volder的研究，是因為1946年版CRC化学和物理手册中的公式而得到靈感：

{\displaystyle {\begin{aligned}K\_{n}R\sin(\theta \pm \varphi )&=R\sin(\theta )\pm 2^{-n}R\cos(\theta ),\\K\_{n}R\cos(\theta \pm \varphi )&=R\cos(\theta )\mp 2^{-n}R\sin(\theta ),\\\end{aligned}}}
其中{\displaystyle \varphi }是使{\displaystyle \tan(\varphi )=2^{-n}}成立的值，且{\displaystyle K\_{n}:={\sqrt {1+2^{-2n}}}}。

他的研究最後產生了一個內部的技術報告，提到用CORDIC演算法來求解正弦及餘弦函數，以及一個實現此功能的原型電腦。報告中也提到用修改版的CORDIC演算法計算雙曲函數、座標旋轉、對數及指數的可能性。用CORDIC來進行乘法和除法運算的想法也是在此時形成。依照CORDIC演算法的原則，Volder的同事Dan H. Daggett發展了在二進位以及二進碼十進數（BCD）之間轉換的演算法。

應用
--

CORDIC用簡單的移位和相加運算來處理像是三角函數、雙曲函數、對數函數、實數及複數乘法、除法、方根計算、線性系統求解、特徵值估測、奇异值分解、QR分解等。因此，CORDIC可以用在許多的應用中，像是信號處理、影像處理、通訊系統、机器人学及三维计算机图形等。

### 硬體

若沒有硬體乘法器的話，CORDIC一般會比其他算法要快很多，若是用FPGA或ASIC的話，使用的邏輯閘也會少很多。

CORDIC是FPGA開發應用程式（像是Xilinx的Vivado）中的標準半导体IP核，而不是使用特殊函數的冪級數實現，其原因是CORDIC IP的通用性，CORDIC可以計算許多不同的函數，而為特定函數開發的乘法器只能計算特定的函數。

另一方面，若有硬體乘法器（例如DSP），查表法及冪級數會比CORDIC快很多。近年來，CORDIC演算法常用在生醫應用中，尤其是用FPGA實現的應用[來源請求]。

使用泰勒级数的問題是此方法可以產生小的絕對誤差，但其中沒有良態的相對誤差。其他多項式近似法，例如Minimax近似演算法（英语：），可以同時控制這二種的誤差。

### 軟體

在CPU只有整數運算的古老系統中，會將CORDIC放在其IEEE 754函式庫的一部份。現代的通用CPU已有浮點運算暫存器，也有加法、減法、乘法、除法、三角函數、平方根、一般對數、自然對數等，幾乎沒有用到CORDIC的場合。只有一些有特殊安全性或是時間要求的應用程式才會用到CORDIC。

運作模式
----

### 旋轉模式

CORDIC可以用來計算許多不同的函數。以下說明如何在旋轉模式（rotation mode）下的CORDIC計算角度的正弦函數和餘弦函數，假設角度以弧度的定點格式表示。要找到一個角度{\displaystyle \beta }的正弦函數和餘弦函數，可以在單位圓上找到對應角度的y座標和座標。利用CORDIC，會從以下的向量{\displaystyle v\_{0}}開始：

{\displaystyle v\_{0}={\begin{bmatrix}1\\0\end{bmatrix}}.}
CORDIC演算法的圖解
在第一次的迭代時，向量逆時針轉45°，得到向量{\displaystyle v\_{1}}。接著繼續的迭代，每一次的角度漸漸變小，旋轉方向可能順時針，也可能逆時針，直到得到想要的角度為止。每一次的角度為{\displaystyle \gamma \_{i}=\arctan {(2^{-i})}}，其中{\displaystyle i=0,1,2,\dots }。

若以更正式的方式表示，每一次的迭代就是一次旋轉，也就是將向量{\displaystyle v\_{i}}乘以旋转矩阵{\displaystyle R\_{i}}：

{\displaystyle v\_{i+1}=R\_{i}v\_{i}.}
旋转矩阵為

{\displaystyle R\_{i}={\begin{bmatrix}\cos(\gamma \_{i})&-\sin(\gamma \_{i})\\\sin(\gamma \_{i})&\cos(\gamma \_{i})\end{bmatrix}}.}
利用以下兩個三角恆等式：

{\displaystyle {\begin{aligned}\cos(\gamma \_{i})&={\frac {1}{\sqrt {1+\tan ^{2}(\gamma \_{i})}}},\\\sin(\gamma \_{i})&={\frac {\tan(\gamma \_{i})}{\sqrt {1+\tan ^{2}(\gamma \_{i})}}},\end{aligned}}}
旋转矩阵變成

{\displaystyle R\_{i}={\frac {1}{\sqrt {1+\tan ^{2}(\gamma \_{i})}}}{\begin{bmatrix}1&-\tan(\gamma \_{i})\\\tan(\gamma \_{i})&1\end{bmatrix}}.}
旋转向量{\displaystyle v\_{i+1}=R\_{i}v\_{i}}就會變成下式

{\displaystyle {\begin{bmatrix}x\_{i+1}\\y\_{i+1}\end{bmatrix}}={\frac {1}{\sqrt {1+\tan ^{2}(\gamma \_{i})}}}{\begin{bmatrix}1&-\tan(\gamma \_{i})\\\tan(\gamma \_{i})&1\end{bmatrix}}{\begin{bmatrix}x\_{i}\\y\_{i}\end{bmatrix}},}
其中{\displaystyle x\_{i}}和{\displaystyle y\_{i}}是{\displaystyle v\_{i}}的分量，若將角度{\displaystyle \gamma \_{i}}限制在使{\displaystyle \tan(\gamma \_{i})=\pm 2^{-i}}的值，和tangent的乘法就以變成乘（或除）2的幂次，在數位電腦硬體中可以快速的用位元右移或左移來計算。因此上法會變成

{\displaystyle {\begin{bmatrix}x\_{i+1}\\y\_{i+1}\end{bmatrix}}=K\_{i}{\begin{bmatrix}1&-\sigma \_{i}2^{-i}\\\sigma \_{i}2^{-i}&1\end{bmatrix}}{\begin{bmatrix}x\_{i}\\y\_{i}\end{bmatrix}},}
其中

{\displaystyle K\_{i}={\frac {1}{\sqrt {1+2^{-2i}}}},}
且{\displaystyle \sigma \_{i}}是用來判斷旋轉方向的。若角度{\displaystyle \gamma \_{i}}為正，則{\displaystyle \sigma \_{i}}為+1，否則則為−1。

所有的{\displaystyle K\_{i}}因子可以在迭代過程中忽略，最後再一次乘以{\displaystyle K(n)}因子即可：

{\displaystyle K(n)=\prod \_{i=0}^{n-1}K\_{i}=\prod \_{i=0}^{n-1}{\frac {1}{\sqrt {1+2^{-2i}}}},}
此數可以事先計算好存在表格中，若迭代次數是固定的，只需計算一個常數且儲存即可，甚至此修正也可以事先進行，將常數先乘以{\displaystyle v\_{0}}，可以節省一次乘法。另外，可以注意到

{\displaystyle K=\lim \_{n\to \infty }K(n)\approx 0.6072529350088812561694}
因此可以簡化演算法的複雜度。有些應用會避免修正{\displaystyle K}，因此此演算法本身會帶一個增益{\displaystyle A}：

{\displaystyle A={\frac {1}{K}}=\lim \_{n\to \infty }\prod \_{i=0}^{n-1}{\sqrt {1+2^{-2i}}}\approx 1.64676025812107.}
在夠多次的迭代後，向量的角度會接近想要的角度{\displaystyle \beta }。以一般的應用來說，40次的迭代（*n* = 40）已可以有小數10位的精度。

唯一未解決的問題是判斷每一次迭代要順時針旋轉或逆時針旋轉（選擇{\displaystyle \sigma }的值）。這可以記錄每一次旋轉的角度，從還需要旋轉的角度中減去此一角度，會得到下一個還需要旋轉的角度{\displaystyle \beta }。若{\displaystyle \beta \_{n+1}}為正，需要順時針旋轉，否則，就需要順時針旋轉：

{\displaystyle \beta \_{0}=\beta }
{\displaystyle \beta \_{i+1}=\beta \_{i}-\sigma \_{i}\gamma \_{i},\quad \gamma \_{i}=\arctan(2^{-i}).}
{\displaystyle \gamma \_{n}}的值需要事先計算且記錄下來。不過若是小角度，根據小角度近似，在定點數下可得{\displaystyle \arctan(\gamma \_{n})=\gamma \_{n}}，因此可以節省儲存用的空間。

如以上所述，角度{\displaystyle \beta }的正弦函數為其*y*坐標，餘弦函數為其*x*坐標。

相關條目
----

* 計算方根的方法（英语：）
* IEEE 754
* 浮点运算器

參考資料
----

1. ↑  Volder, Jack E.  (PDF). Proceedings of the Western Joint Computer Conference (WJCC) (presentation) (San Francisco, California, USA: National Joint Computer Committee (NJCC)). 1959-03-03: 257–261  [2016-01-02].
2. ↑  Volder, Jack E.  (PDF). IRE Transactions on Electronic Computers (The Institute of Radio Engineers, Inc. (IRE)). 1959-05-25, **8** (3): 330–334 (reprint: 226–230) (September 1959)  [2016-01-01]. EC-8(3):330–334. （原始内容 (PDF)存档于2021-06-12）.  请检查`|publication-date=`中的日期值 (帮助)
3. ↑  Walther, John Stephen. 写于Palo Alto, California, USA.  (PDF). Proceedings of the Spring Joint Computer Conference (Atlantic City, New Jersey, USA: Hewlett-Packard Company). May 1971, **38**: 379–385  [2016-01-01]. （原始内容 (PDF)存档于2021-06-12） –American Federation of Information Processing Societies (AFIPS).
4. ↑  Walther, John Stephen.. The Journal of VLSI Signal Processing (Hingham, MA, USA: Kluwer Academic Publishers). June 2000, **25** (2 (Special issue on CORDIC)): 107–112. ISSN 0922-5773. S2CID 26922158. doi:10.1023/A:1008162721424.
5. ↑  Luo, Yuanyong; Wang, Yuxuan; Ha, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing.. IEEE Transactions on Very Large Scale Integration (VLSI) Systems. September 2019, **27** (9): 2156–2169. S2CID 196171166. doi:10.1109/TVLSI.2019.2919557.
6. ↑  Luo, Yuanyong; Wang, Yuxuan; Ha, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing.. IEEE Transactions on Very Large Scale Integration (VLSI) Systems. September 2019, **27** (9): 2222. S2CID 201711001. doi:10.1109/TVLSI.2019.2932174.
7. ↑  Briggs, Henry.. London. 1624.  (Translation:  的存檔，存档日期4 March 2016.)
8. ↑  Laporte, Jacques.. Paris, France. 2014  [2016-01-02]. （原始内容存档于2015-03-09）.   的存檔，存档日期2020-08-10.
9. ↑  Flower, Robert.. London: J. Beecroft. 1771  [2016-01-02].
10. 1 2 3  Volder, Jack E.  (internal report), Convair, Aeroelectronics group, 1956-06-15, IAR-1.148
11. 1 2 3 4 5 6 7  Volder, Jack E.  (PDF). Journal of VLSI Signal Processing (Hingham, MA, USA: Kluwer Academic Publishers). June 2000, **25** (2 (Special issue on CORDIC)): 101–105  [2016-01-02]. ISSN 0922-5773. S2CID 112881. doi:10.1023/A:1008110704586. （原始内容 (PDF)存档于2016-03-04）.
12. ↑  Perle, Michael D. Computer Design (Boston, MA, USA: Computer Design Publishing Corp.), June 1971: 72–78  (NB. Some sources erroneously refer to this as by *P. Z. Perle* or in *Component Design*.)
13. ↑  Schmid, Hermann.  1 (reprint). Malabar, Florida, USA: Robert E. Krieger Publishing Company. 1983: 162, 165–176, 181–193  [2016-01-03]. ISBN 0-89874-318-4.  (NB. At least some batches of this reprint edition were misprints with defective pages 115–146.)
14. ↑  Daggett, Dan H.. IRE Transactions on Electronic Computers (The Institute of Radio Engineers, Inc. (IRE)). September 1959, **8** (3): 335–339  [2016-01-02]. ISSN 0367-9950. doi:10.1109/TEC.1959.5222694. EC-8(3):335–339.
15. ↑  Meher, Pramod Kumar; Valls, Javier; Juang, Tso-Bing; Sridharan, K.; Maharatna, Koushik.  (PDF). IEEE Transactions on Circuits and Systems I: Regular Papers. 2008-08-22, **56** (9): 1893–1907 (2009-09-09). S2CID 5465045. doi:10.1109/TCSI.2009.2025803.  请检查`|publication-date=`中的日期值 (帮助)
16. ↑  Meher, Pramod Kumar; Park, Sang Yoon.. IEEE Transactions on Very Large Scale Integration (VLSI) Systems. February 2013, **21** (2): 217–228. S2CID 7059383. doi:10.1109/TVLSI.2012.2187080.
17. ↑ . Math Stack Exchange.  [2021-01-01].
18. ↑  Muller, Jean-Michel.  2. Boston: Birkhäuser. 2006: 134  [2015-12-01]. ISBN 978-0-8176-4372-0. LCCN 2005048094.
19. ↑  Andraka, Ray.  (PDF). ACM (North Kingstown, RI, USA: Andraka Consulting Group, Inc.). 1998  [2016-05-08]. 0-89791-978-5/98/01.

外部連結
----


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
处理器技术 |
| --- |
|  |
| 模型 | 

|  |  |
| --- | --- |
| 顺序模型 | 
* 图灵机
	+ 通用
	+ 波斯特-图灵机
	+ 量子
* 传动带机器（英语：）
* 堆疊結構機器
* 有限状态机
	+ 具数据通路（英语：）
	+ 分层（英语：）
	+ 队列（英语：）
* 寄存器机
	+ 计数器
	+ 指针（英语：）
	+ 隨機存取機
	+ 隨機存取儲存程式機

 |
|  |
| 函数式模型 | 
* 递归函数
* Λ演算
* 组合子逻辑
* 細胞自動機

 |

 |
|  |
| 架構 | 
* 微架構
* 冯·诺伊曼结构
* 哈佛架構
	+ 修正哈佛架構（英语：）
* 資料流架構（英语：）
* 传输触发（英语：）
* 元胞（英语：）
* 字节序
* 异构（英语：）
* Fabric（英语：）
* 多元處理
* 認知計算
* 神经形态（英语：）

|  |  |
| --- | --- |
| 内存访问 | 
* 非均匀访存模型(NUMA)
* 均匀访存模型(UMA)
* 载入/存储（英语：）
* 寄存器/存储器（英语：）

 |
|  |
| 缓存层级（英语：） | 
* 缓存层级（英语：）

 |
|  |
| 記憶體階層 | 
* 虚拟内存
* 第二级存储器

 |

 |
|  |
| 指令集架構 | 

|  |  |
| --- | --- |
| 类型 | 
* 复杂指令集(CISC)
* 精简指令集(RISC)
* 专用指令集处理器
* 显式数据图像并行（英语：）(EDGE)
	+ TRIPS（英语：）
* 超長指令集(VLIW)
* 顯式並行指令運算(EPIC)
* 最小指令集（英语：）(MISC)
* 單一指令集(OISC)
* 無指令集（英语：）(NISC)
	+ 零指令集(ZISC)
* 比較（英语：）

 |
|  |
| 指令集 | 
* x86
* ARM
* MIPS
* LoongArch
* PowerPC
* SPARC
* IA-64
* Unicore（英语：）
* MicroBlaze（英语：）
* RISC-V
* LMC（英语：）
* 其他（英语：）

 |

 |
|  |
| 执行 | 

|  |  |
| --- | --- |
|  | 
* 流水线停顿
* 操作数转发（英语：）
* 经典 RISC 流水线（英语：）

 |
|  |
| 危障 | 
* 数据依赖
* 數據危障
* 結構危障
* 控制危障
* 伪共享

 |
|  |
| 乱序执行 | 
* 托马苏洛算法
	+ 保留站
	+ 重排序缓冲区
* 寄存器重命名

 |
|  |
| 推测执行 | 
* 分支預測
	+ 存储相关性预测（英语：）

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 并行层次 | 
* 位级并行
	+ 位序列（英语：）
	+ 字
* 指令级并行
* + 标量
	+ 純量
	+ 超純量
* 任務并行
	+ 线程
	+
* 数据并行
	+ 向量
* 記憶體
* 分布式

 |
|  |
| 執行緒 | 
* 多執行緒
* 同时多线程
	+ 超執行緒
* 超執行緒
* 超級線程（英语：）
* 预测多线程（英语：）
* 抢占式
* 协作式

 |
|  |
| 費林分類法 | 
* 單指令流單數據流(SISD)
* 單指令流多數據流(SIMD)
	+ 寄存器内（英语：）
* 单指令多线程（英语：）(SIMT)
* 多指令流單數據流(MISD)
* 多指令流多數據流(MIMD)
	+ 单程序多数据（英语：）

 |

 |
|  |
| 電腦性能 | 
* 晶體管數量
* 每周期指令(IPC)
	+ 每指令周期(CPI)
* 每秒指令(IPS)
* 每秒浮點運算次數(FLOPS)
* 每秒事务处理量 (TPS)
* 效能功耗比(PPW)

 |
|  |
| 類別 | 
* 中央处理器(CPU)
* 圖形處理器(GPU)
	+ 图形处理器通用计算(GPGPU)
* 向量处理器
* 桶状（英语：）
* 串流處理
* 輔助處理器
* 特殊應用積體電路(ASIC)
* 现场可编程逻辑门阵列(FPGA)
* 複雜可程式化邏輯裝置(CPLD)
* 多晶片模組(MCM)
* 封裝體系(SiP)

|  |  |
| --- | --- |
| 按应用 | 
* 微处理器
* 单片机(MCU)
* 移动处理器（英语：）
* 笔记本电脑处理器（英语：）
* 超低电压（英语：）
* 专用指令集处理器(ASIP)

 |
|  |
| 片上系统 | 
* 片上系统(SoC)
* 多处理器片上系统（英语：）(MPSoC)
* 可编程片上系统(PSoC)
* 片上网络（英语：）(NoC)

 |
|  |
| 硬件加速 | 
* 人工智能加速器
* 视觉处理单元(VPU)
* 物理處理器(PPU)
* 數位訊號處理器(DSP)
* 张量处理器(TPU)
* 安全加密協處理器
* 网络处理器
* 基頻處理器

 |

 |
|  |
| 字长 | 
* 
* 4位元
* 8位元
* 12位元
* 
* 16位元
* 24位元（英语：）
* 32位元
* 48位元（英语：）
* 64位元
* 128位元
* 
* 位元分割（英语：）
* 其他
	+

 |
|  |
| 核心数量 | 
* 单核（英语：）
* 多核
* 众核（英语：）
* 异构

 |
|  |
| 組件 | 
* 核心
* 缓存
	+ CPU缓存
	+ 置換機制
	+ 一致性
* 总线
* 
* 定時器訊號
* 先進先出演算法(FIFO)

|  |  |
| --- | --- |
| 功能单元 | 
* 算術邏輯單元(ALU)
* 地址生成单元(AGU)
* 浮點運算器(FPU)
* 內存管理單元(MMU)
	+ 载入-存储单元（英语：）
	+ 轉譯後備緩衝區(TLB)
* 内存控制器(IMC)

 |
|  |
| 邏輯閘 | 
* 组合逻辑电路
* 时序逻辑电路
* Glue（英语：）
* 邏輯閘
	+ 量子閘
	+ 逻辑门阵列（英语：）

 |
|  |
| 寄存器 | 
* 寄存器
* 状态寄存器（英语：）
* 栈寄存器（英语：）
* 寄存器堆
* 記憶體缓冲区
* 程式計數器

 |
|  |
| 总线 | 
* 位址匯流排
* 控制匯流排
* 后端总线

 |
|  |
| 控制单元 | 
* 指令单元（英语：）
* 緩衝器
* 写入缓冲区（英语：）
* 微程序ROM
* 计数器

 |
|  |
| 数据通路 | 
* 数据选择器
* 数据分配器
* 加法器
* 乘法器
	+ CPU倍频器
* 译码器
	+ 地址解码器（英语：）
	+ 加和寻址解码器（英语：）
* 桶式移位器

 |
|  |
| 電路 | 
* 集成电路
	+ 3D
	+ 混合訊號
	+ 電源管理
* 布尔（英语：）
* 数字
* 模拟
* 量子
* 开关

 |

 |
|  |
| 电源管理 | 
* 电源管理单元（英语：）(PMU)
* 高级电源管理
* 高级配置与电源接口(ACPI)
* 
* 动态电压调节
* 时钟门控
* 效能功耗比(PPW)
* 空闲竞争（英语：）

 |
|  |
| 相关内容 | 
* 通用CPU历史（英语：）
* 微处理器年代表（英语：）
* 处理器设计
* 数字电路
* 硬件安全模块
* 半导体制造
* Tick-Tock
* 推測執行漏洞集合

 |

 |