星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » 用C#计算圆周率
admin - 2008-7-3 22:28:00
这个C#版的计算圆周率程序就是在C程序的基础上改写的。C#版的程序必须使用C#2.0编译,算法和C程序是一样的,都是利用圆周率的反正切展式的泰勒级数来计算,但C#程序充分使用面象对象的编程方法,并且程序中有适当的注释,比C程序容易理解多了。C#程序从配置文件中读取计算所用的公式,允许自己增加计算公式。 using System; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
using System.IO; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
using System.Text.RegularExpressions; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
using System.Collections.Generic; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
using System.Diagnostics; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
namespace Skyiv.Util íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
// 用反正切展式计算圆周率 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
// 例如: pi= + 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
sealed class ThePi íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 表示 (positive ? + : -) coefficient * arctan(1/denominator) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public sealed class Term íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
bool positive;  // 系数是否正数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int coefficient; // 系数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int denominator; // 分母 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
public bool Positive { get { return positive; } } íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
public int Coefficient { get { return coefficient; } } íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
public int Denominator { get { return denominator; } } íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
public Term(bool positive, int coefficient, int denominator) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
this.positive = positive; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
this.coefficient = coefficient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
this.denominator = denominator; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
public override string ToString() íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
return string.Format("{0} {1} * arctan(1/{2}) ", positive ? "+" : "-", coefficient, denominator); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
const int overDigits = 3;          // 额外计算的位数,以消除误差 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    List<Term> list = new List<Term>(); // 反正切展式 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
string name;                        // 反正切展式的发现者 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public ThePi(string name) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
this.name = name; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public void Add(Term term) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      list.Add(term); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 返回反正切展式,例如: pi= + 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public override string ToString() íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
string s = "pi= "; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
foreach (Term term in list) s += term.ToString(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
return s + "[" + name + "]"; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 将圆周率精确到小数点后 digits 位的值以及所用时间输出到 tw íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public void Out(TextWriter tw, int digits) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
const int digitsPerGroup = 5; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
const int groupsPerLine = 13; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
const int digitsPerLine = groupsPerLine * digitsPerGroup; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      tw.WriteLine(
this); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      TimeSpan elapsed; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] piValue = Compute(digits, out elapsed); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      tw.Write(
"pi= {0}.", piValue[piValue.Length - 1]); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int position = 6; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
for (int i = piValue.Length - 2; i >= overDigits; i--, position++) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        tw.Write(piValue); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (position % digitsPerLine == 0) tw.WriteLine(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
else if (position % digitsPerGroup == 0) tw.Write(" "); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
if ((position - 1) % digitsPerLine != 0) tw.WriteLine(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      tw.WriteLine(
"[{0}] DIGITS:{1:N0} ELAPSED:{2}", name, digits, elapsed); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 计算圆周率到小数点后 digits 位, 并统计所用时间 elapsed íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
int [] Compute(int digits, out TimeSpan elapsed) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      Stopwatch stopWatch
= new Stopwatch(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      stopWatch.Start(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] piValue = Compute(digits + overDigits); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      Format(piValue); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      stopWatch.Stop(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      elapsed
= stopWatch.Elapsed; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
return piValue; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 计算圆周率到小数点后 digits 位, 结果未格式化 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
int [] Compute(int digits) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] pi  = new int [digits + 1]; // 圆周率的值, 反序存放,如: 951413 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] tmp = new int [digits + 1]; // 中间计算结果,也是反序存放 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
foreach (Term term in list) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
// arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 - x^11/11 + .. íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int validDigits = digits; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int dividsor = term.Denominator; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
bool positive = term.Positive; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        Array.Clear(tmp,
0, tmp.Length); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        tmp[digits]
= term.Coefficient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        Divide(
true, positive, true, ref validDigits, pi, tmp, dividsor); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        positive
= !positive; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        dividsor
*= dividsor; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
for (int step = 3; validDigits > 0; positive = !positive, step += 2) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          Divide(
false, true, true, ref validDigits, null, tmp, dividsor); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          Divide(
true, positive, false, ref validDigits, pi, tmp, step); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
return pi; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 计算 sum += 或 -= (dividend /= 或 / divisor) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
void Divide( íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
bool updateSum,      // 是否更新sum íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
bool positive,      // 系数是否正数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
bool updateDividend, // 是否更新被除数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
ref int digits,      // 被除数的有效位数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] sum,          // 和数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int [] dividend,    // 被除数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int dividsor        // 除数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      ) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
for (int remainder = 0, i = digits; i >= 0; i--) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int quotient = 10 * remainder + dividend; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        remainder
= quotient % dividsor; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        quotient
/= dividsor; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (updateDividend) dividend = quotient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (!updateSum) continue; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (positive) sum += quotient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
else sum -= quotient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
if (updateDividend) while (digits > 0 && dividend[digits] == 0) digits--; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 将 pi 数据组中的每个元素格式化为个位数 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
void Format(int [] pi) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
for (int quotient = 0, i = 0; i < pi.Length; i++) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int numerator = pi + quotient; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        quotient
= numerator / 10; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int remainder = numerator % 10; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (remainder < 0) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          remainder
+= 10; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          quotient
--; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        pi
= remainder; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
  }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
// 用一组反正切展式表示圆周率 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
sealed class Pi íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      List
<ThePi> list = new List<ThePi>(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
/* 从 ini 文件中读入初始配置,其格式如下: íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    # eg. pi = 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    Stormer  + 176 57 + 28 239 - 48 682 + 96 12943 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    Stomer  +  24  8 +  8  57 +  4 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    Gauss    +  48 18 + 32  57 - 20 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    Machin  +  16  5 -  4 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
*/ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public Pi(string iniFileName) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
using (StreamReader sr = new StreamReader(iniFileName)) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
            Regex regex
= new Regex(@"\s+"); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
           
for (;;) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
           
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
string s = sr.ReadLine(); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
if (s == null) break; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
if (s.Length == 0 || s[0] == '#') continue; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
string [] ss = regex.Split(s); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
if (ss.Length % 3 != 1) throw new ApplicationException("ini文件栏目数不正确"); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                ThePi thePi
= new ThePi(ss[0]); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
               
for (int i = 1; i < ss.Length; i += 3) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                  thePi.Add(
new ThePi.Term(ss[0] == '+', int.Parse(ss[i+1]), int.Parse(ss[i+2]))); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                list.Add(thePi); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
            }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 输出全部的反正切展式 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public void Out(TextWriter tw) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
int i = 0; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
foreach (ThePi thePi in list) tw.WriteLine("{0,2}: {1}", ++i, thePi); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
// 使用 formula 展式计算圆周率精确到小数点后 digits 位,并将其值以及所用时间输出到 tw íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
public void Out(TextWriter tw, int formula, int digits) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        list[formula].Out(tw, digits); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
  }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
  íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
sealed class TheMain íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
 
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
static void Main(string [] args) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
   
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      TextWriter tw
= Console.Out; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
try íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          Pi pi
= new Pi("pi.ini"); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
         
if (args.Length < 1) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
         
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
            pi.Out(tw); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
            tw.WriteLine(
"Usage: pi formula [ digits ]"); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
           
return; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
          }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
         
int formula = Convert.ToInt32(args[0]); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
int digits = 1000; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (args.Length > 1) digits = Convert.ToInt32(args[1]); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
if (digits < 0) digits = 0; íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        pi.Out(tw, formula
- 1, digits); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
catch (Exception ex) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
     
{ íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
        tw.WriteLine(ex.Message); íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
      }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
    }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
  }
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
}
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该程序需要的配置文件(pi.ini)如下: íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
---------------------------------------------------------- íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
# eg. pi = 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Stormer  + 176 57 + 28 239 - 48 682 + 96 12943 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Stomer  +  24  8 +  8  57 +  4 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Gauss    +  48 18 + 32  57 - 20 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Machin  +  16  5 -  4 239 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
---------------------------------------------------------- íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
运行结果: íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
C> pi íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1: pi= + 176 * arctan(1/57) + 28 * arctan(1/239) - 48 * arctan(1/682) + 96 * arctan(1/12943) [Stormer] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2: pi= + 24 * arctan(1/8) + 8 * arctan(1/57) + 4 * arctan(1/239) [Stomer] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3: pi= + 48 * arctan(1/18) + 32 * arctan(1/57) - 20 * arctan(1/239) [Gauss] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
4: pi= + 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Usage: pi formula [ digits ] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
C> pi 4 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
pi= + 16 * arctan(1/5) - 4 * arctan(1/239) [Machin] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
pi= 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 32823 06647 09384 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
46095 50582 23172 53594 08128 48111 74502 84102 70193 85211 05559 64462 29489 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
54930 38196 44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 45648 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
56692 34603 48610 45432 66482 13393 60726 02491 41273 72458 70066 06315 58817 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
48815 20920 96282 92540 91715 36436 78925 90360 01133 05305 48820 46652 13841 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
46951 94151 16094 33057 27036 57595 91953 09218 61173 81932 61179 31051 18548 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 98336 73362 44065 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
66430 86021 39494 63952 24737 19070 21798 60943 70277 05392 17176 29317 67523 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
84674 81846 76694 05132 00056 81271 45263 56082 77857 71342 75778 96091 73637 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
17872 14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 42019 95611 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
21290 21960 86403 44181 59813 62977 47713 09960 51870 72113 49999 99837 29780 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
49951 05973 17328 16096 31859 50244 59455 34690 83026 42522 30825 33446 85035 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
26193 11881 71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 59825 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
34904 28755 46873 11595 62863 88235 37875 93751 95778 18577 80532 17122 68066 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
13001 92787 66111 95909 21642 01989 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[Machin] DIGITS:1,000 ELAPSED:00:00:00.0342141 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
C> pi 1 10000 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
pi= + 176 * arctan(1/57) + 28 * arctan(1/239) - 48 * arctan(1/682) + 96 * arctan(1/12943) [Stormer] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
pi= 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
... íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
24988 72758 46101 26483 69998 92256 95968 81592 05600 10165 52563 75678 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[Stormer] DIGITS:10,000 ELAPSED:00:00:03.7817852 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
运行环境是 Pentium 4 2.8GHz PC机。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1
查看完整版本: 用C#计算圆周率