PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm zur Eulerzahl


Fussabtreter
2004-09-29, 11:30:01
Könnte mir jemand nen Programm schreiben mit dem ich bestimmte Stellen der Eulerzahl "e" anzeigen lassen kann.

Sprich wenn ich z.B. die 211 Stelle brauche müsste mir das Programm genau diese anzeigen.

Wäre echt super wenn das jeman schaffen würde, danke!

Jazz
2004-09-29, 14:10:32
Was du da verlangst, ist nicht so ohne weiteres in 5 Minuten realisiert. Für die ersten paar Stellen tuts ein festes Array, wo du dann einfach den Index abfragst.

Die ersten 200 Stellen von e:
2,718 281 828 459 045 235 360 287 471 352 662 497 757 247 093 699 959 574 966 967 627 724 076 630 353 547 594 571 382 178 525 166 427 427 466 391 932 003 059 921 817 413 596 629 043 572 900 334 295 260 595 630 738 132 328 627 943 490 763 233 829 880 753 195 251 019 01

Für alle weiteren Stellen, wenn du sie nicht als Resource einbinden kannst, brauchst du eine Berechnung. Am geeignetsten scheint dafür der Zusammenhang:

e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ...

Da du sehr viele Stellen brauchst, reichen Standardberechnungsroutinen nicht aus. Du musst dir ein eigenes System schaffen, wie du einerseits e speicherst und andererseits die Fakultät berechnest, z.B. mit einem MMF.

Die Diskussion ist eröffnet,
Jazz

Edit: PS: Schaffen würde ich das schon, so ein Programm zu schreiben ... ;)

Gast
2004-09-29, 14:24:04
Falls du in c++ programmierst kannst du als Datentyp ExtremeFloats, der in Zeckensacks Quelltext für den Mandelbrotgenerator ist, nutzen.Du müsstet dazu noch eine Methode schreiben, die die Fakultät berechnet und eine die eine Division ermöglicht.

Stone2001
2004-09-29, 20:07:06
Ich weiß zwar nicht, was schneller konvergiert, aber (1 + 1/n)^n konvergiert für n gegen unendlich auch gegen die Euler'sche Zahl e.

Fussabtreter
2004-09-29, 20:15:42
mhhh ja ich hab selbst null Ahnung vom programmieren!
Und von Stone ist die Definition die wir in Mathe gelernt haben.

Danke schonmal das ihr euch damit beschäftigt!

Jazz
2004-09-29, 20:38:30
Ich weiß zwar nicht, was schneller konvergiert, aber (1 + 1/n)^n konvergiert für n gegen unendlich auch gegen die Euler'sche Zahl e.
Für eine programmiererische Umsetzung braucht man aber eine Reihe oder einen rekursiven Algorithmus, weshalb ich oben auch sinngemäß "geeignete Berechnung" geschrieben habe.

Jazz
2004-09-29, 20:42:29
mhhh ja ich hab selbst null Ahnung vom programmieren!
Wofür brauchst du dann die e-Berechnung, wenn ich mal so indiskret fragen darf? :|

Fussabtreter
2004-09-29, 20:46:35
Wir haben in Mathe nen Art Euler Tag. Klingt scheiße isses auch *g* Ne erst ma gucken vielleicht wird es interessant.
Und da gab es jetzt im Vorfeld ne Aufgabe sich auf irgend eine Weise ein Programm oder ausdruck zu beschaffen, mit dem jede beliebige Zahl die der Lahrer sagt angezeigt werden kann. Da dacht ich gleich an euch, da ich wie gesagt kein Plan vom Programmieren habe.

Jazz
2004-09-29, 20:53:03
Und wann ist dieser Tag? ;) ... Jetzt interessierts mich langsam auch ...

Fussabtreter
2004-09-29, 20:56:20
:eek: Freitag ;(

Jazz
2004-09-29, 21:00:25
:eek: Freitag ;(
:eek: Das wird eng ... na mal sehen ...

Fussabtreter
2004-09-29, 21:04:11
Ok danke!

Stone2001
2004-09-29, 21:33:35
Für eine programmiererische Umsetzung braucht man aber eine Reihe oder einen rekursiven Algorithmus, weshalb ich oben auch sinngemäß "geeignete Berechnung" geschrieben habe.
hmm, warum brauche ich, um e zu berechnen eine Reihe oder einen rekursiven Algorithmus?
Das einzigste, was ich brauche, wäre einen anständigen Datentyp mit Potenzfunktion (oder Multiplikation). Wer mit welchem Aufwand, welche Genauigkeit hinbekommt ist unklar.

Jazz
2004-09-29, 21:37:33
hmm, warum brauche ich, um e zu berechnen eine Reihe oder einen rekursiven Algorithmus?
Das einzigste, was ich brauche, wäre einen anständigen Datentyp mit Potenzfunktion (oder Multiplikation). Wer mit welchem Aufwand, welche Genauigkeit hinbekommt ist unklar.
Eben. Ab einer Million Stellen wirds nämlich interessant. Außerdem ist bei der Reihe genau die Stelle bestimmbar, bis zu der das Ergebnis zuverlässig ist. Was der der Formel mit Limes gegen Unendlich nicht der Fall ist.

Stone2001
2004-09-29, 21:44:24
Eben. Ab einer Million Stellen wirds nämlich interessant. Außerdem ist bei der Reihe genau die Stelle bestimmbar, bis zu der das Ergebnis zuverlässig ist. Was der der Formel mit Limes gegen Unendlich nicht der Fall ist.
OK, ich hab gerade mal im Heuser nachgeschlagen.
Also, vergesst mal ganz schnell e mittels (1 + 1/n)^n zubestimmen. Die Konvergenz ist dermaßen schlecht, das man selbst mit n = 10^9 keine nennenswerte Genauigkeit hat, da konvergiert die Reihe wesentlich schneller.

Jazz
2004-09-29, 22:58:05
Gerade im Netz gefunden: Hier (http://www.saschahlusiak.de/downloads/e.txt) gibts die ersten 50000 Stellen zum runterladen. Weil mit Eigenentwicklung ist bis Freitag schon sehr eng ...

Fussabtreter
2004-09-30, 16:59:53
Hat schon jemand ne Lösung des Problems?

Jazz
2004-09-30, 17:59:24
Ich werds nicht bis morgen schaffen. Ich bin bissl krank heute. *schnief* Da ist mir nicht nach programmieren ...

PS. Warum gibt es hier nicht dieses :puke: Smiley?

Fussabtreter
2004-09-30, 18:42:14
Ich hab noch wa gefunden.
http://www.matheboard.de/lexikon/Eulersche_Zahl,definition.htm#Programmbeispiele_zur_Berechnung_von_e
Hilft dir das weiter?

Jazz
2004-09-30, 20:56:51
Die Seite geht bei mir nicht.

Es geht auch weniger um "zurechtkommen" als vielmehr die Tatsache, dass es mir zu schlecht geht für so komplexe Gedankengänge. Die Berechnung für die Fakultät großer Zahlen hab ich gestern noch fertiggekriegt, aber es fehlt noch die Division. Und das ist heut einfach nicht drin. Sorry. ;(

Senior Sanchez
2004-09-30, 21:02:37
Ich hab sowas mal gemacht, e auf die verschiedensten Weisen berechnet. Am leichtesten ist es denke ich per Taylor-Reihe zu berechnen, das geht recht zackig und sowas ist auch schnell implementiert (ne sache von nicht mal 10 min ;) ). Die Frage ist nur, wieviele Stellen dein Lehrer maximal will. Weil, das wird dann schon schwieriger, weil ich würde sowas mit java machen und dann muss ich ja schon auf BigDecimal zurückgreifen *fg* Aber sowas is dann net schnell implementiert. Also sag mal, wieviel stellen brauchste maximal?


mfg Senior Sanchez

Fussabtreter
2004-09-30, 21:09:56
Ist ne Mio drin?

Fussabtreter
2004-09-30, 21:15:06
Probier einfach wie weit du kommst.
Ich muss jetzt noch mal weg...
Wenn du bis morgen nix hinbekommst ist auch ok, aber danach brauch ich es dann auch net mehr.

But thx a lot for your help!

Senior Sanchez
2004-09-30, 23:10:16
import java.math.BigDecimal;

/**
* @author Sen[ior Sanchez]
* @version 1.0
*/
public class Euler {

public static void main(String args[]) {
int stellen = Integer.parseInt(args[0]);

Euler euler = new Euler();

euler.berechneEuler(stellen);
}

public void berechneEuler(int stellen) {
BigDecimal e = new BigDecimal(1.0);
BigDecimal pre_e = new BigDecimal(1.0);

boolean stellen_erreicht = false;
BigDecimal counter = new BigDecimal(0);
BigDecimal foo = new BigDecimal(1);


while(stellen_erreicht == false) {
counter = counter.add(new BigDecimal(1));
e = e.add( foo.divide(fakultaet(counter), stellen, BigDecimal.ROUND_HALF_EVEN) );

if( (e.subtract(pre_e)).doubleValue() <= 0)
stellen_erreicht = true;

pre_e = e.abs();
}

System.out.println(e);
}

public BigDecimal fakultaet(BigDecimal n) {
if(n.doubleValue() > 1.0) {
return n.multiply(fakultaet(n.subtract(new BigDecimal(1))));
}
else
return n;
}

}


So, ich habe den code mal schnell zusammengehackt. Er sollte funktionieren, ist aber nen bissl dirty und er frisst CPU-Leistung (das is kein scherz). Das besondere an dem Algorithmus is, dass er BigDecimal-Objekte nutzt die eine beliebig große Genauigkeit erlauben (soviel wie der Java Heap hergibt, also maximal glaube 2 GB für das Objekt). Habs gerade mal durchgechecked, 1000 Stellen gehen recht fix, mehr wird aber recht heftig, vor allem durch die Fakultätsfunktion und das viele nachkommastellenrechnen. Also wenn dann tue dir selbst nen gefallen und lasses auf nem schnellen Rechner mit JRE 1.5 laufen.

hier noch das class-File: http://siemens.md.st.schule.de/~ameier/Euler.class

zum ausführen einfach eingeben (java sollte inner Umgebungsvariable sein)

java Euler 10000

die letzte Zahl gibt die Nachkommastellen an.

mfg Senior Sanchez

Fussabtreter
2004-10-01, 06:58:23
irgendwie hab ich kein Plan wie ich das jetzt starte.
Hat jemand sofort ne Lösung für mich?

Senior Sanchez
2004-10-01, 16:12:53
irgendwie hab ich kein Plan wie ich das jetzt starte.
Hat jemand sofort ne Lösung für mich?


dazu musste die Java Runtime Environment (JRE) installiert haben und idealerweise die auch in die Umgebungsvariable eingetragen haben. Öffne einfach nen Konsolenfenster, gehe in das Verzeichnis wo die Euler.class liegt und rufe dann auf:

java Euler 10000

die letzte Zahl sind die Nachkommastellen. Falls er sagt das er den Befehl java nicht kennt, so gib einfach den Pfad zur java.exe an, bei mir is das zum beispiel:

R:\Programme\Java\jre1.5.0\bin\java.exe Euler 10000

mfg Senior Sanchez

Fussabtreter
2004-10-01, 19:21:21
Ah ok! Naja Euler Show ist vorbei.

1 hatte 600mio Stellen von ner japanischen Seite. Er hatte auch das Glück das der Pc net rechnen musste sondern die Zahl e als datei gespeichert war. 2 andere sind bei großen Zahlen mit Rechnen baden gegagen.

Mal gucken wie es bei mir wird, da er die Zahlen erstmal eingesammelt hat.

Aber nochmal großen dank an EUCH! :)

ethrandil
2004-10-01, 22:35:07
Ichwill trotzdem nochmal meinen Dünnpfiff dazu abgeben *gg*

Die Fakultät häte in dem Programm nicht immer neu berechnet werden müssen, amn hätte einfach die neue Zahl zur alten fakultät hinzumultiplizieren müssen... :-)

Ich hab das Programm auf diese Art und Weise umgeschrieben und auf 4 Prozesse optimiert... lasses nun auf nem Xeon mit 2 cpus und Hyperthreading laufen mit 60.000 Stellen... bis gleich *g*

- Eth

Senior Sanchez
2004-10-02, 01:18:10
Ichwill trotzdem nochmal meinen Dünnpfiff dazu abgeben *gg*

Die Fakultät häte in dem Programm nicht immer neu berechnet werden müssen, amn hätte einfach die neue Zahl zur alten fakultät hinzumultiplizieren müssen... :-)

Ich hab das Programm auf diese Art und Weise umgeschrieben und auf 4 Prozesse optimiert... lasses nun auf nem Xeon mit 2 cpus und Hyperthreading laufen mit 60.000 Stellen... bis gleich *g*

- Eth


ich habe ja gesagt dass das ganze Programm nen schneller Hack war und da nix optimiert war, war einfach nur nen proof-of-concept wie man das ganze semantisch korrekt implementieren könnte. ;)

Machen wir jetzt hier wohl extreme-optimierung wie? *g* naja, ich benchmarke das vllt mal am WE nen bissl, wenn ich zeit finde. dann lasse ich das mal rocken auf meinem Athlon XP 1800+ *rofl*


mfg Senior Sanchez