計算自然對數的底數(e)

自然對數的底數e,定義為 \(\displaystyle e=\lim_{n\to\infty}\left(1+\frac{1}{n}\right)^n\) \(\displaystyle= \frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+\cdots\) \(\displaystyle\approx 2.718281828\cdots\) ,又稱為尤拉常數。

在數學上有個知名的尤拉恆等式 \(e^{i \pi}+1=0\),它包含了數學上最重要的幾個常數(\(e, \pi, i, 0, 1\)),且巧妙得結合了虛數與實數。

以下利用 \(\displaystyle e= \frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+\cdots\) 當作定義,求 \(e\) 的近似值。

//定義 euler_number 函數,輸入的參數 precision 
//若求和的各項比 procision 還小即捨棄。
fun euler_number(precision: Double = 1e-10): Double =
  1.0 + generateSequence(1) { it + 1 }
//generateSequence 用來產生無窮數列
    .map { 1.0/(1..it).reduce(Int::times) }
//把產生的自然數無窮數列,對應到 1/n!
    .takeWhile { it > precision }
//各項只取比 procision 還大的值。
    .sum()
//將各項求和

fun main() = print("%.5f".format(euler_number()))
//格式化 euler_number 輸出到小數點以下第九位數字。
//輸出: 2.71828

待改良的點:各項先轉換成雙精度浮點數(double)仍會有自動四捨五入的缺點,求出來的和仍可能比實際數值大。

有特別用的的工具:

generateSequence 函數

map 方法

reduce 方法

takeWhile 方法

sum 方法


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *