man das weglassen kann und EPSILON aus <limits> nehmen kann -- perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
Nur ist das in diesem Fall nicht richtig, weil explizit 17 Stellen Genauigkeit verlangt wurden. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
Wen man die Formel anders aufschreibt, kommt man auch ohne long aus:
C++:
longdouble x = 1; for (int n=20;n>1 ;n--) {//schon 1/19! < 1e-17 x/=n; x+=1; };
Beispiel:
Code:
1+1/2+1/6+1/24 = 1+ 1/2(1+1/3(1+1/4))
Man muss nur vorher n bestimmen, aber das kann man ja mit einem normalen double machen:
C++:
double f = 1; int i = 1; for (; f<1e17; i++) f*=i; //1e17 = 1/epsilon n=i;
Man muss sich noch Gedanken machen, ob die restlichen Terme sich aufsummieren könnten, aber diese Reihe ist so schnell konvergent, dass das wohl nicht der Fall ist.