自然対数の底を求めてみるよ!

ネイピア数を求める時に用いるマクローリン展開をどこまで整合性の取れる値を計算できるか試してみた。
マクローリン展開の公式がこれ!

この公式通りにプログラムを書いても良いのけど、そうすると階乗を何回も計算することにより無駄が多い。また先に分数を計算することにより、浮動小数点の演算の計算の頻度が多くなり、整合性と計算速度の面でも良くない。
ので、先にn!倍した各項の合計をを最後にn!で割るという方法で行くことにした
C言語で書いたソース

#include <stdio.h>

//nの階乗を返す
int fact(int n){
	if(n == 0)
		return 1;
	return n * fact(n-1);
}
//1/n!まで合計したネイピア数を出力する
double Maclaurin(int n){
	int sum_val = 0;
	int val = 1;
	int fact_n = fact(n);
	int i;
	for(i=0; i<=n; i++){
		if(i == 0){
			sum_val += fact_n;
		}else{
			val *= i;
			sum_val += fact_n/val;
		}
	}
	return (double)sum_val/val;
}
int main(){
	int i;
	for(i=0; i<20; i++){
		printf("#Case %2d: %13.10f\n", i, Maclaurin(i));
	}
	return 0;
}

#Case  0:  1.0000000000
#Case  1:  2.0000000000
#Case  2:  2.5000000000
#Case  3:  2.6666666667
#Case  4:  2.7083333333
#Case  5:  2.7166666667
#Case  6:  2.7180555556
#Case  7:  2.7182539683
#Case  8:  2.7182787698
#Case  9:  2.7182815256
#Case 10:  2.7182818011
#Case 11:  2.7182818262
#Case 12:  2.7182818283
#Case 13:  0.4952754305
#Case 14: -0.6399285410
#Case 15:  0.5754160728
#Case 16:  0.5752868802
#Case 17:  2.7182818143
#Case 18: -2.0622273375
#Case 19:  2.7182818115

from mpmath import *
import timeit
import datetime

def fact(n):
    if n == 0:
        return 1
    return n*fact(n-1)
'''結果はfact()と同じだが、再帰関数を用いないようにした'''
def _fact(n):
    ret = 1
    if n == 0:
        return 1
    for i in range(1, n+1):
        ret *= i
    return ret

def maclaurin(n):
    sum_val = 0
    val = 1
    fact_n = _fact(n)
            
    for i in range(0, n+1):
        if i == 0:
            sum_val += fact_n
        else:
            val *= i
            sum_val += fact_n/val
    '''浮動小数点の精度を概算する'''
    mp.dps = int(log10(mpf(1)/fact_n) * -1) + 2
    ret = mpf(sum_val)/mpf(val)
    return ret

for i in range(0, 20):
    print("#Case:%2d") %i,
    print maclaurin(i)

#Case: 0 1.0
#Case: 1 2.0
#Case: 2 2.5
#Case: 3 2.7
#Case: 4 2.71
#Case: 5 2.717
#Case: 6 2.718
#Case: 7 2.7183
#Case: 8 2.71828
#Case: 9 2.718282
#Case:10 2.7182818
#Case:11 2.71828183
#Case:12 2.718281828
#Case:13 2.7182818284
#Case:14 2.71828182846
#Case:15 2.718281828459
#Case:16 2.71828182845904
#Case:17 2.718281828459045
#Case:18 2.7182818284590452
#Case:19 2.718281828459045235
#Case:20 2.7182818284590452353

メモリリークバッファオーバーフローを起こして停止してしまったため、再帰関数を用いない_fact()を使うことにした。
オーバーフローすることもなくて結構うまく行っている

折角なので、10000桁ほどまで求めてみる。

#Case:3248
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770417189861068739696552126715468895703503540212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508868769664035557071622684471625607988265178713419512466520103059212366771943252786753985589448969709640975459185695638023637016211204774272283648961342251644507818244235294863637214174023889344124796357437026375529444833799801612549227850925778256209262264832627793338656648162772516401910590049164499828931505660472580277863186415519565324425869829469593080191529872117255634754639644791014590409058629849679128740687050489585867174798546677575732056812884592054133405392200011378630094556068816674001698420558040336379537645203040243225661352783695117788386387443966253224985065499588623428189970773327617178392803494650143455889707194258639877275471096295374152111513683506275260232648472870392076431005958411661205452970302364725492966693811513732275364509888903136020572481765851180630364428123149655070475102544650117272115551948668508003685322818315219600373562527944951582841882947876108526398139559900673764829224437528718462457803619298197139914756448826260390338144182326251509748279877799643730899703888677822713836057729788241256119071766394650706330452795466185509666618566470971134447401607046262156807174818778443714369882185596709591025968620023537185887485696522000503117343920732113908032936344797273559552773490717837934216370120500545132638354400018632399149070547977805669785335804896690629511943247309958765523681285904138324116072260299833053537087613893963917795745401613722361878936526053815584158718692553860616477983402543512843961294603529133259427949043372990857315802909586313826832914771163963370924003168945863606064584592512699465572483918656420975268508230754425459937691704197778008536273094171016343490769642372229435236612557250881477922315197477806056967253801718077636034624592787784658506560507808442115296975218908740196609066518035165017925046195013665854366327125496399085491442000145747608193022120660243300964127048943903971771951806990869986066365832322787093765022601492910115171776359446020232493002804018677239102880978666056511832600436885088171572386698422422010249505518816948032210025154264946398128736776589276881635983124778865201411741109136011649950766290779436460058519419985601626479076153210387275571269925182756879893027617611461625493564959037980458381823233686120162437365698467037858533052758333379399075216606923805336988795651372855938834998947074161815501253970646481719467083481972144888987906765037959036696724949925452790337296361626589760394985767413973594410237443297093554779826296145914429364514286171585873397467918975712119561873857836447584484235555810500256114923915188930994634284139360803830916628188115037152849670597416256282360921680751501777253874025642534708790891372917228286115159156837252416307722544063378759310598267609442032619242853170187817729602354130606721360460003896610936470951414171857770141806064436368154644400533160877831431744408119494229755993140118886833148328027065538330046932901157441475631399972217038046170928945790962716622607407187499753592127560844147378233032703301682371936480021732857349359475643341299430248502357322145978432826414216848787216733670106150942434569844018733128101079451272237378861260581656680537143961278887325273738903928905068653241380627960259303877276977837928684093253658807339884572187460210053114833513238500478271693762180049047955979592905916554705057775143081751126989851884087185640260353055837378324229241856256442550226721559802740126179719280471396006891638286652770097527670697770364392602243728418408832518487704726384403795301669054659374616193238403638931313643271376888410268112198912752230562567562547017250863497653672886059667527408686274079128565769963137897530346606166698042182677245605306607738996242183408598820718646826232150802882863597468396543588566855037731312965879758105012149162076567699506597153447634703208532156036748286083786568030730626576334697742956346437167093971930608769634953288468336130388294310408002968738691170666661468000151211434422560238744743252507693870777751932999421372772112588436087158348356269616619805725266122067975406210620806498829184543953015299820925030054982570433905535701686531205264956148572492573862069174036952135337325316663454665885972866594511364413703313936721185695539521084584072443238355860631068069649248512326326995146035960372972531983684233639046321367101161928217111502828016044880588023820319814930963695967358327420249882456849412738605664913525267060462344505492275811517093149218795927180019409688669868370373022004753143381810927080300172059355305207007060722339994639905713115870996357773590271962850611465148375262095653467132900259943976631145459026858989791158370934193704411551219201171648805669459381311838437656206278463104903462939500294583411648241149697583260118007316994373935069662957124102732391387417549230718624545432220395527352952402459038057445028922468862853365422138157221311632881120521464898051800920247193917105553901139433166815158288436876069611025051710073927623855533862725535388309606716446623709226468096712540618695021431762116681400975952814939072226011126811531083873176173232352636058381731510345957365382235349929358228368510078108846343499835184044517042701893819942434100905753762577675711180900881641833192019626234162881665213747173254777277834887743665188287521566857195063719365653903894493664217640031215278702223664636357555035655769488865495002708539236171055021311474137441061344455441921013361729962856948991933691847294785807291560885103967819594298331864807560836795514966364489655929481878517840387733262470519450504198477420141839477312028158868457072905440575106012852580565947030468363445926525521370080687520095934536073162261187281739280746230946853678231060979215993600199462379934342106878134973469592464697525062469586169091785739765951993929939955675427146549104568607020990126068187049841780791739240719459963230602547079017745275131868099822847308607665368668555164677029113368275631072233467261137054907953658345386371962358563126183871567741187385277229225947433737856955384562468010139057278710165129666367644518724656537304024436841408144887329578473484900030194778880204603246608428753518483649591950828883232065221281041904480472479492913422849519700226013104300624107179715027934332634079959605314460532304885289729176598760166678119379323724538572096075822771784833616135826128962261181294559274627671377944875867536575448614076119311259585126557597345730153336426307679854433857617153334623252705720053039882894990342595662329757824887350292591668258944568946559926584547626945287805165017206747854178879822768065366506419109734345288783386217261562695826544782056729877564263253215942944180399432170000905426507630955884658951717091476074371368933194690909819045012903070995662266203031826493657336984195557769637876249188528656866076005660256054457113372868402055744160308370523122425872234388541231794813885500756893811249353863186352870837998456926199817945233640874295911807474534195514203517261842008455091708456823682008977394558426792142734775608796442792027083121501564063413416171664480698154837644915739001212170415478725919989438253649505147713793991472052195290793961376211072384942906163576045962312535060685376514231153496656837151166042207963944666211632551577290709784731562782775987881364919512574833287937715714590910648416426783099497236744201758622694021594079244805412553604313179926967391575424192966073123937635421392306178767539587114361040894099660894714183406983629936753626215452472984642137528910798843813060955526227208375186298370667872244301957937937860721072542772890717328548743743557819665117166183308811291202452040486822000723440350254482028342541878846536025915064452716577000445210977355858976226554849416217149895323834216001140629507184904277892585527430352213968356790180764060421383073087744601708426882722611771808426643336517800021719034492342642662922614560043373838683355553434530042648184739892156270860956506293404052649432442614456659212912256488935696550091543064261342526684725949143142393988454324863274618428466559853323122104662598901417121034460842716166190012571958707932175696985440133976220967494541854071184464339469901626983516078489245140589409463952678073545797003070511636825194877011897640028276484141605872061841852971891540196882532893091496653457535714273184820163846448324990378860690080727093276731275819665639411489617168329804551397295066876047409154204284299935410258291135022416907694316685742425225090269390348148564513030699251995904363840284292674125734224477655841778861717372654620854982944989467873509295816526320722589923687684570178230380965678831122893058091405726108658848458731016581511675333276748870148291674197015125597825727074064318086014281490241467804723275976842696339357735429301867394397163886117642090040686633988568416810038723892144831760701166845038872123643670433140911557332801829779887365909166596124020217785588548761761619893707943800566633648843650891448055710397652146960276625835990519870423001794655367

from mpmath import *

def _fact(n):
    ret = 1
    if n == 0:
        return 1
    for i in range(1, n+1):
        ret *= i
    return ret

def maclaurin(n, a):
    sum_val = 0
    val = 1
    fact_n = _fact(n)
            
    for i in range(0, n+1):
        if i == 0:
            sum_val += fact_n
        else:
            val *= i
            sum_val += fact_n/val
    hoge = int(log10(mpf(1)/fact_n) * -1) + 2
    if hoge > a:
        mp.dps = hoge      
        ret = mpf(sum_val)/mpf(val)
        return ret
    else:
        return 0   

a = int(raw_input("Input Accuracy:"))
i = 0
while 1:
    hoge = maclaurin(i, a)
    if hoge != 0:
        break
    i += 1
print ("#Case:%d") %i
print hoge

<実行結果>

Input Accuracy:1000
#Case:450
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354

初めてPythonを触ったけど、ハマりそう。
今のところはPythonと言うより、C言語のソースをPythonで書きなおしただけのものなので頑張ろう