
C++ 絕對值:驅動程式碼的定義
在 C++ 中,一個數的絕對值是它與零之間的非負距離,記為 |x|,你可以使用 std::abs 來計算整數類型,或使用 std::fabs 來計算浮點數類型。這個規則與小學數學所教的一樣:若 x ≥ 0,則 |x| = x;若 x < 0,則 |x| = -x。C++ 的標準函式庫提供了現成的函式,因此你很少需要自己撰寫判斷,而當這些函式無法使用時(或者你正在學習演算法),一個三元運算式就能產生相同的結果。例如,std::abs(-12) 會回傳 12,std::abs(3.5) 會回傳 3.5,std::abs(0) 會回傳 0。整數版的函式位於 <cstdlib>,浮點數版的函式位於 <cmath>,所以首先要做的是引入正確的標頭檔。一旦標頭檔引入完成,函式的呼叫方式就和其他任何函式一樣:傳入值、讀取其大小、像其他變數一樣儲存或輸出它。
絕對值提供不含方向的大小,因此當符號會造成誤導時,它就是完美的工具。在 C++ 程式中,當你在比較誤差、距離或變化量時,通常會需要大小。標準函式庫的函式與手動邏輯在每個輸入上都一致,因此只要理解其中一個,就等於理解了全部。
C++ 計算絕對值的三種方法
C++ 提供不只一種方式來計算 |x|,而選擇哪一種取決於你引入的標頭檔以及你處理的類型。下表總結了本指南所涵蓋的三種方法,讓你能快速挑選。
| 方法 | 標頭檔 | 接受類型 | 回傳類型 | 範例呼叫 |
|---|---|---|---|---|
| std::abs | <cstdlib> | int | int | std::abs(-5) |
| std::abs | <cmath> | int, long, long long, float, double, long double | 與輸入相同 | std::abs(-3.14) |
| std::fabs | <cmath> | float, double, long double | 與輸入相同 | std::fabs(-2.5) |
| 手動三元運算 | 不需要 | 任何數值類型 | 與輸入相同 | (x < 0 ? -x : x) |
C++17 對 <cmath> 的更新新增了整數型別的多載 std::abs 版本,因此在現代編譯器中,單獨引入 <cmath> 通常就已足夠。如果你的目標是較舊的標準,唯一不同的是你必須為整數 abs 引入 <cstdlib>,並為浮點數 fabs 引入 <cmath>。
撰寫 C++ 絕對值程式碼
每當你在 C++ 程式中需要 |x| 時,請依照以下具體步驟操作。這些步驟適用於任何符合標準的編譯器,包括 GCC、Clang 和 MSVC,並且涵蓋了標準函式庫路徑以及無標頭檔的替代方案。
- 引入所需類型的標頭檔:整數使用 #include <cstdlib>,浮點數值使用 #include <cmath>(也用於 C++17 或更新版本中新增的多載 std::abs 版本)。
- 宣告一個相符類型的變數,並指派你想取絕對值的數值。例如:int x = -12; 或 double temperature = -3.14;。
- 呼叫函式並將結果儲存到新變數中,或直接傳入另一個運算式:int magnitude = std::abs(x); 或 double magnitude = std::fabs(temperature);。
- 像處理其他任何數字一樣輸出或使用結果:std::cout << magnitude << std::endl;。這個絕對值可以像原始值一樣被回傳、儲存到向量中,或與其他絕對值進行比較。
- 如果標準函式庫無法使用,或者你想把演算法寫得更明確,請將函式呼叫替換為三元運算形式:int magnitude = (x < 0 ? -x : x);。這在所有 C++ 版本中都能編譯,並且在所選類型可容納的任何數值上,行為都與 std::abs 完全相同。
當你撰寫手動版本時,請注意一個微妙的特殊情況:如果你的數值是該類型可表示的最小負整數(例如 32 位元有號 int 上的 INT_MIN),則運算式 -x 會發生溢位,因為其對應的正數無法被表示。在這種情況下,請使用 long long 或無符號類型,或者直接呼叫 std::abs,它會自動處理這個轉換。
實作範例:C++ 中的 -12
以 x = -12 為例,逐步套用手動規則,再用函式庫驗證:
規則:|x| = x(若 x ≥ 0),否則 |x| = -x。 代入 x = -12,此值為負,因此使用 |x| = -x。 |x| = -(-12) = 12。 使用標準函式庫驗證:std::abs(-12) 會回傳 12。兩種方法的結果一致,你可以將任一結果直接貼入你的程式碼或作業中。
如何使用絕對值計算機找出 |x|
當你不想編譯程式而想快速得到結果時,絕對值計算機會在你輸入的瞬間回傳 |x|。它完全在瀏覽器中執行,接受負數、小數和科學記號,並在你編輯輸入時即時更新結果。透過以下三個步驟,你可以立即得到答案。
- 在輸入欄位中輸入任何數字。負數、小數,以及像 1.2e-4 或 6.02e23 這類科學記號形式都可以接受。
- 在結果面板中讀取絕對值 |x|。輸出會在你輸入時即時更新,無需按下任何按鈕,也無需等待計算。
- 點擊 複製 按鈕,將 |x| 放到你的剪貼簿,以便貼入作業、試算表或程式碼註解中。
當你在檢查問題的答案、驗證測量誤差的大小,或是在將邊界情況提交到 C++ 程式前進行合理性檢查時,這個工具非常有用。由於所有資料都不會離開你的瀏覽器,你可以貼上那些不想上傳的數值,而且結果會在你編輯輸入時即時更新。
絕對值在程式碼以外的應用
同樣的定義也出現在程式設計以外的領域,認識它能讓 C++ 版本感覺更自然。在測量中,測量值與真實值之間的絕對誤差為 |測量值 - 真實值|;正負號會告訴你是高估還是低估,但誤差的大小則是絕對值。在幾何中,數線上兩點 a 和 b 之間的距離為 |a - b|,交換相減的順序並不會改變答案,因為絕對值符號會去除正負號。
絕對值同樣定義了不等式中的絕對值符號,例如 |x - 5| < 2,它描述了所有與 5 相距兩個單位以內的數字。在統計學和機器學習中,同樣的運算式支撐著迴歸模型中使用的平均絕對誤差和 L1(曼哈頓)距離。在物理學中,速度是速度向量的大小;在訊號處理中,振幅是波形的絕對峰值;兩者都在保留大小的同時去除方向——這正是在 C++ 中,當你要求取得向量分量或迴圈中誤差項的大小時,std::abs 所做的事情。
限制、邊界情況與快速合理性檢查
絕對值的表現相當穩定,但仍有少數邊界情況值得注意。絕對值永遠不會是負數:對所有實數 x 而言,|x| ≥ 0。一個數字與其負數擁有相同的絕對值,因此永遠有 |x| = |-x|。唯一絕對值為 0 的數字就是 0 本身:當且僅當 x = 0 時,|x| = 0。這三條規則在所有 C++ 類型以及所有版本的標準函式庫中都成立。
一個用於對程式碼和答案進行合理性檢查的有用恆等式是 |x| = √(x²)。平方運算會去除正負號,而主平方根會回傳非負的根,從而得到相同的大小。你可以在 C++ 中透過 std::sqrt(x * x) 來驗證這一點,不過標準函式庫的 std::abs 更簡潔,並且當 x 是能容納於你所選類型的整數時,還能避免浮點數的四捨五入誤差。
在處理非常大或非常小的數字時,請記住浮點數輸入的上限受到 IEEE 754 範圍的限制,double 大約是 1.8 × 10³⁰⁸。超出此範圍的值會超過電腦能儲存的範圍,系統會將其標記出來,而不是默默地進行四捨五入。絕對值計算機繼承了這個限制:它接受電腦可表示範圍內的任何實數,並對超出範圍的值進行提示,而不是自行猜測。該計算機完全在你的瀏覽器中運算,因此不會上傳任何資料,而且結果會在你編輯輸入時即時更新,使其成為快速進行大小檢查的天然利器。
最後,請把手動三元運算視為教學工具的程度,與其作為替代方案的程度相當。實際產品程式碼應依賴 std::abs 或 std::fabs,這樣溢位和類型提升才會遵循函式庫的規則,而非你自訂的規則。在極少數你必須避免使用標頭檔的情況下,或在演算法面試中——其目的是展示規則,而非交付產品程式碼——可以把三元運算式放在手邊備用。
想更深入了解,請參閱如何在 Excel 中計算絕對值(ABS 函式)。
想更深入了解,請參閱Java 絕對值計算:快速指南。