2017-04-22 41 views
3

我試圖通過計算ê號C#

e = 1 + (1/1! + 1/2! + 1/3! + ..) 

用戶會選擇這種形式的試驗次數計算Ë數。 form

int trialNumber = Convert.ToInt32(Math.Round(trialNumberForm.Value, 0)); 
     int factorial = trialNumber; 
     float factResult = 0; 

     for (int i = 1; i < trialNumber; i++) 
     { 

      for (int b = 1; b < i; b++) //calculates x! here. 
      { 
       factorial = factorial * b; 


      } 
      factResult = factResult + (1/factorial); 
     } 
     factResult++; 
     MessageBox.Show(factResult.ToString()); 

它計算過號碼,你選擇哪個結果1!我試圖改變變量類型從雙浮動,但沒有解決它。如何通過我上面寫的公式來處理數字?

+1

您嘗試更改哪種變量類型?請注意,'1/factorial'目前將是整數算術......還要注意,因子將很快溢出'int' ... –

+0

它被稱爲「整數除法」,查看它。分割'factResult = factResult +(1/factorial);'in to'var temp =(1/factorial); factResult = factResult + temp;'看看'temp'的值是什麼,'temp'的類型也是。 –

+0

'factorial'是一個正整數,所以'1/factorial'總是0.我認爲將它改爲'1.0/factorial'會有幫助。 – kabdulla

回答

7

你在階乘沒有必要(其整數除法整數溢出問題),因爲在所有

1/(n+1)! == (1/n!)/(n+1) 

您可以實現e計算一樣容易

double factResult = 1; // turn double into float if you want 
    double item = 1;  // turn double into float if you want 

    for (int i = 1; i < trialNumber; ++i) 
    factResult += (item /= i); 

    ... 

    MessageBox.Show(factResult.ToString()); 

成果:

trial number | e 
    ------------------------------- 
       1 | 1 
       2 | 2 
       3 | 2.5 
       4 | 2.666666... 
       5 | 2.708333... 
      10 | 2.71828152557319 
      15 | 2.71828182845823 
      20 | 2.71828182845905 
+0

我認爲這裏是唯一正確的答案! –

+1

讓我堅定地看到人們計算泰勒級數的階乘,當你的方式是明顯的答案。也很好地展示了二次收斂。 – duffymo

+0

@duffymo:這仍然是泰勒系列。然而,收斂是超線性的(與實現無關),因爲度數n部分和的誤差受到2 /(n + 1)!的限制。可以比較計算exp(0.5)^ 2或exp(0.25)^ 4是否更快,即使考慮到額外的平方乘法。 – LutzL

1

由於@kabdulla和@ScottChamberlain說,你正在做的,你需要一個浮動師整數除法:

for (int b = 1; b < i; b++) //calculates x! here. 
{ 
    factorial = factorial * b; 
} 
factResult = factResult + (1/factorial); 

應該

for (int b = 2; b < i; b++) //calculates x! here. 
{ 
    factorial = factorial * b; 
} 
factResult = factResult + (1.0/factorial); 

另外,我在b = 2開始for循環,因爲乘以1是無用的。