正木です。
ruby-dev にはふさわしくない話題なのでこちらに書きます。

From: "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp>
Subject: [ruby-dev:20598] Re: [BigDecimal] renaming proposal

|もっとも、一番の問題は
| 級数展開でいいの?
| 誤差判定をどうするの?
|です。
|sqrt は正確に判定できるので残しますが、E、PI、sincos 等は
|取りあえず C からは削除して、今後の検討課題ということにし
|たいと思います。

私の Real class では実数(複素数)を Cauchy 列と誤差項の
無限列の組合せで表現しますので、誤差項が分からないと関数
が書けません。
指数関数の誤差項につては以下に書くことに気付くまでかなり
苦労したので、参考になればと思って書いておきます。

πを求めるのに arctan を使うときは、交代級数になるので問題
はありません。
(私は色々試した結果 Ramanujan の式が一番早そうなのでそれを
使っています。)
sin,cos で引数が実数の場合も、交代級数なのでこれも問題はあ
りません。引数が虚数のときは指数関数で表すことになります。

そこで問題の指数関数ですが

exp(x)=1 + x + … + x**n/n! + R

と Taylor 展開したときに Lagrange の剰余項

R =  x**(n+1)/(n+1)! * exp(x*theta) , 0 < theta <1

を使えば

|R| < |x|**(n+1)/(n+1)! * 3**|x|.ceil

となりますが、これは |x| が大きいときには、かなりの過大評価
になって実用的ではありません。

しかし n が充分大きくて

y=|x|/n < 1

となる場合には

|R| <= |x|**(n+1)/(n+1)! + |x|**(n+2)/(n+2)! + … 
< (|x|**n/n!)*(y + y**2 +  … )
 = |x|**n/n! * y/(1-y)

となるので特に

2*|x| < n

の時には誤差項を最終項の絶対値以下にすることができます。

自然対数の底を求めるだけなら、連分数展開を使う方が早いようです。

---
正木 功