首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 計算圓周率:基於反正切級數的高精度實現

     編輯:關於C語言

引言

圓周率(π)計算是經典的數值計算問題。本文介紹一個 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ᵢ 為正整數分母。經典公式包括:

  • Machin:π = 16·arctan(1/5) - 4·arctan(1/239)
  • Gauss:π = 12·arctan(1/18) + 8·arctan(1/57) - 5·arctan(1/239)
  • Störmer:π = 24·arctan(1/8) + 8·arctan(1/57) + 4·arctan(1/239)

程式架構設計

Term 類別:單項式封裝

每個 Term 封裝一個級數項:正負號、係數、分母。提供 ToString() 輸出可讀公式字串。

ThePi 類別:計算引擎

  • 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>

使用者可自行新增公式無需重編譯,體現開放封閉原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved