圓周率(π)計算是經典的數值計算問題。本文介紹一個 C# 2.0 實現的高精度圓周率計算程序,採用反正切函數的泰勒級數展開,支援 Machin、Gauss、Störmer 等多種公式,並可透過設定檔擴充公式。程式充分運用物件導向設計,結構清晰、易於理解與維護。
利用反正切函數的泰勒展開:
arctan(x) = x - x³/3 + x⁵/5 - x⁷/7 + x⁹/9 - ...
配合 Machin 類公式:
π = Σ cᵢ · arctan(1/dᵢ)
其中 cᵢ 為整數係數,dᵢ 為正整數分母。經典公式包括:
每個 Term 封裝一個級數項:正負號、係數、分母。提供 ToString() 輸出可讀公式字串。
List<Term> 儲存公式所有項Add(Term) 動態組合公式Out(TextWriter, int digits) 輸出格式化結果(每行 65 位、每組 5 位)Compute(int digits) 核心計算邏輯,返回反序儲存的整數陣列程式以整數陣列模擬大整數,每個元素存一位十進制數字(基數 10),低位在前(反序)。核心運算 Divide 實現長除法:
for (int i = digits; i >= 0; i--) {
int quotient = 10 * remainder + dividend[i];
remainder = quotient % divisor;
quotient /= divisor;
// 更新被除數或累加到結果
}
計算流程:對每一項,先除以分母得首項,後續各項先平方分母再除以奇數步長,正負交替累加。為消除尾部捨入誤差,實際多算 3 位(overDigits = 3)最後捨去。
程式使用 Stopwatch 計時。輸出範例(Machin 公式,1000 位):
pi= 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 ...
[Machin] DIGITS:1000 ELAPSED:00:00:00.123
雖然基數 10 效率非最優,但邏輯直觀,適合教學與驗證。若需極致效能,可改用基數 10⁹ 配合 FFT 乘法(參考 BigArithmetic)。
公式從設定檔讀取,格式如:
<formula name="Machin">
<term sign="+" coefficient="16" denominator="5"/>
<term sign="-" coefficient="4" denominator="239"/>
</formula>
使用者可自行新增公式無需重編譯,體現開放封閉原則。