HOWTO · C
C 語言中的指數
本文介紹瞭如何在 C 語言中使用指數函式。
本頁內容
在 C 中,浮點數次方和負指數可使用 <math.h> 的 pow()。若指數是非負整數,則可用乘法迴圈讓結果維持整數型別。選擇方法時要留意:pow() 會傳回 double,而整數迴圈可能使結果超出所用型別的範圍。
在 C 中如何進行次方運算
次方運算是將底數自乘若干次。例如在 2^3 中,底數是 2,指數是 3,因此結果為 8。C 沒有次方運算子:^ 代表位元 XOR。請依照所需的輸入與結果型別,使用數學函式庫函式或自行撰寫迴圈。
函式 pow(base, exponent) 接受算術型別的引數,包括整數,並會傳回 double。載入 <math.h> 即可取得它的函式宣告。部分工具鏈需要連結數學函式庫,例如常見類 Unix 系統上的 GCC;編譯時可使用 gcc powers.c -o powers -lm。
使用 pow() 計算浮點數次方
如果底數或指數可能是小數、指數可能為負數,或結果適合使用浮點數表示,請使用 pow()。例如,double result = pow(2.0, 3.0); 會計算浮點數次方。此處僅展示呼叫語法;完整程式若使用此函式,且工具鏈有要求,就必須連結數學函式庫。
由於結果是浮點數,即使數學上的答案是整數,也可能受到浮點數表示方式與捨入誤差影響。請選擇適合的 printf 格式,以顯示所需的精度。如果建置時出現找不到 pow 的參照,請確認編譯器對數學函式庫的連結要求;在常見類 Unix 系統上使用 GCC 時,可將 -lm 放在來源檔或物件檔之後,例如 gcc powers.c -o powers -lm。
使用迴圈計算非負整數次方
當輸入值與所需結果都是整數時,使用迴圈可以避免將結果轉成浮點數。將累加器初始化為 1,接著每經過一個指數步驟,就乘上一次底數。
以下完整程式使用乘法迴圈計算 2 的 3 次方。請執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
#include <stdio.h>
int main(void) {
int base = 2;
int exponent = 3;
int result = 1;
for (int i = 0; i < exponent; ++i) {
result *= base;
}
printf("%d raised to the power of %d is %d\n", base, exponent, result);
return 0;
}
2 raised to the power of 3 is 8
將累加器從 1 開始,指數為 0 時就會得到 1,也就是乘法單位元素。此迴圈適用於非負整數指數。重複乘法所需的時間與指數成正比。指數較大時,可以用平方求冪減少乘法次數,但仍無法突破結果型別的範圍限制。
選擇合適的方法並留意限制
若指數是小數或負數,或可接受浮點數結果,請使用 pow()。例如,pow(2.0, -3.0) 的結果是 0.125,因為負指數代表對應正次方的倒數。上方的整數迴圈不適合這種情況:整數結果無法表示帶有小數部分的倒數。
整數型別的位元寬度與範圍取決於 C 的實作。使用較寬的型別可以延後溢位,但無法避免溢位。無號整數運算會以該型別的最大值加一為模數循環;有號整數溢位則不保證會以這種方式循環,因此不可依賴此行為。如果結果可能超出所選型別的範圍,請選擇合適的表示方式,或在乘法前偵測溢位。pow() 對某些輸入也有定義域與值域條件;遇到相關情況時,請查閱 C 函式庫的文件。