乘積累加運算

乘積累加運算（）是在-{zh-hans:数字信号; zh-hant:數位信號;}-處理器或一些微處理器中的特殊運算。實作此運算操作的硬體電路單元，被稱為「乘数累加器」。這種運算的操作，是將乘法的乘積結果和累加器 A 的值相加，再存入累加器：

若沒有使用 MAC 指令，上述的程序可能需要二個指令，但 MAC 指令可以使用一個指令完成。而許多運算（例如卷积运算、点积运算、矩阵运算、数字滤波器运算、乃至多项式的求值运算）都可以分解為數個 MAC 指令，因此可以提高上述运算的效率。

MAC指令的輸入及輸出的數據類型可以是整數、定點數或是浮點數。若處理浮點數時，會有兩次的數值修約（Rounding），這在很多典型的DSP上很常見。若一條MAC指令在處理浮點數時只有一次的數值修約，則這種指令稱為「融合乘加運算」/「積和熔加运算」（fused multiply-add, FMA）或「熔合乘法累积运算」（fused multiply–accumulate, FMAC）。

 积和熔加运算 
融合乘加運算的操作和乘積累加的基本一樣，對於浮點數的操作也是一條指令完成。但不同的是，非融合乘加的乘積累加運算，處理浮點數時，會先完成b×c的乘積，將其結果數值修約到N個位元，然後才將修約後的結果與暫存器a的數值相加，再把結果修約到N個位元；融合乘加則是先完成a+b×c的操作，獲得最終的完整結果後方才修約到N個位元。由於減少了數值修約次數，這種操作可以提高運算結果的精度，以及提高運算效率和速率。

積和融加運算可以顯著提升像是這些運算的性能和精度：
 點積
 矩陣乘法
 多項式方程求解（像是秦九韶算法等）
 牛頓法求解-{函數}-的零點

通常依靠積和融加運算來取得更精確的運算結果。然而，Kahan指出，如果不加思索地使用這種運算操作，在某些情況下可能會帶來問題。像是平方差公式，它等價於，若果x與y已知數值，使用積和融加運算來求結果，哪怕時，因為在進行首次乘法操作時無視低位的有效位元，可能會使運算結果出錯，如果是多步運算，第一步就出錯則會連累後續的運算結果接連出錯，比如前述的平方差求值後，再取結果的平方根，那麼這個結果也會出錯。

 參考資料 

 参见 
 熔合乘法累积指令集
 BLAS

Category:計算機算術
Category:数字信号处理