Dann zeige uns doch Deinen Sketch, den Du bisher hast und beschreibe Deine Probleme anhand dieses Sketches.
Setze Deinen Code bitte in Codetags (</>-Button oben mitte im Forumseditor oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Hat mich mal interessiert, wie man das einstielt, ohne ein einzigen Byte RAM oder Flash zu beanspruchen.
Rekursiv und doch ohne Stack verbrauch.
So sieht das dann aus: (so kann das dann aussehen)
// Fakultät n=rechentiefe
template<uint64_t n>struct fac{constexpr operator uint64_t(){return fac<n-1>()*n;}};
template<>struct fac<0>{constexpr operator uint64_t(){return 1;}};
// Eulersche Zahl k=rechentiefe
template<unsigned k>struct euler{constexpr operator float(){return euler<k-1>()+1e0/fac<k>();}};
template<>struct euler<0>{constexpr operator float(){return 1e0;}};
// eine Tiefe von 9 ist für AVR float ausreichend
constexpr float eulerZahl = euler<9>();
//constexpr float eulerZahl = M_E;
Leider entspricht das dann nicht mehr der Anforderung im Eingangs Posting, dass es auf dem Arduino laufen soll, denn es wird vollständig im Kompiler abgehandelt.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
float e=2,p=1,z=1,d=1;
Serial.println(" Durchlauf exp() Nenner Abweichung ");
while(d>=-0|) { // Bedingung bis e erreicht ist
z=d;
Serial.print(z,10); //10 .. Nachkommastellen beid er Ausgabe
Serial.print(" ");
Serial.print(e,10); //aktuelle Zahle e
Serial.print(" ");
Serial.print(p,10); //Nenner des Summanden
Serial.print(" ");
Serial.println(z,10);
//Neue Berechnung
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Im Angang sieht man ein Bild, wie es zum Schluss aussehen soll.
Es soll jede Ausgabe auf 10 Nachkommastellen gerundet werden, das geht doch mit Serial.print(Variable,10).
Ich komme irgendwie mit der Formel nicht weiter.
Kann mir da wer einen Tipp geben?
was heisst bis e erreicht ist ? vermutlich wirst Du das nie erreichen. Bedenke der Arduino UNO rechnet mit etwa 6 stellen Genauigkeit bei realen (float) Zahlen.
ich hatte ja schon mal einen Tipp gegeben. Erst mal eine richtige Formel suchen. Das was Du da geschrieben hast ist falsch.
ich würde das erst mal in drei Schritte aufteilen
Fakultät berechnen 1-n
Terme (Brüche) berechnen 1-n
Summe berechnen 1-n
dazu kannst Du ein zwei Array´s verwenden und dann für jeden Schritt eine Schleife aufbauen. Über alles kannst Du dann nochmals eine Schleife bauen um das n zu erhöhen. Wenn Du die Formel in eine Zeile schreiben willlst verlierst Du den Überblick.
Also für Dich als Grundlage
Zahlenbereicher der Variabelntypen festlegen
Was sind Arrays
was ist eine for.. schleife
Dann gehst Du nacheinander an die drei Schritte und verwendest immer schön ein paar Seriell.print() auf dem Monitor um das zu kontrollieren.
Heinz
Hallo!
Diese Reihe habe ich ja oben auch gemeint. Nur weiß ich nicht wie ich die schreiben soll.
Hast du die Abbruchbedingung mit einer If - Satz gemacht?
Also wenn Abweichung 0 ist, soll er aufhören zu zählen?
LG
Matthias 36078
Und nein, was "Euler" ist und tut, halte ich erstmal geheim, denn es ist ja deine Aufgabe das zu lernen, zu verstehen, wie man das baut/rechnet. Da hilft es nix, wenn du bei mir abschreibst. Zudem ist meine Variante so "naja", dass du damit direkt durch die Prüfung rasselst.
Wenn du das Prinzip erstmal verstanden hast, dann gibts 1000 Varianten, wie man das ausformulieren kann, da brauchst du meine Variante nicht.
Aber wie schon gesagt: Mein Euler hält sich streng an die Summenformel.
Nur, dass es eben nicht mit k gegen unendlich läuft, sondern nach deinem Prinzip die Schleife abbricht.
Hallo!
Würdest du dir nicht die for Schleife ersparen, wenn du eine while Schleife verwendest?
Bei einer While Schleife wird doch der Code so lange durchgeführt, bis die Bedingung erfüllt ist, oder?
LG
Matthias36078
Hallo,
ich will dich mal was anstubsen, hier mal ein einfacher Ansatz ohne Array wie man die Fakultät berechnen kann. Damit kannst Du ja jetzt mal anfangen. Ergänzen und aufhübschen überlass ich Dir.
Heinz
uint32_t fk_n_minus1 = 1;
uint32_t fk_n;// Fakultät von n
byte i=1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (i <=10) {
fk_n = fk_n_minus1 * i;
Serial.print(i); Serial.print("\t");
Serial.println(fk_n);
i++;
fk_n_minus1 = fk_n;// neuen Wert im alten ablegen
}
}
ja schon , aber was ist die Abbruchbedingung ? Eventuell wird das = ja nie erreicht. Da macht es doch mehr Sinn bei einem festen n aufzuhören. Natürlich kannst Du auch eine kleine Differenz als Abbruch nehmen, eine die Deinen Anforderungen genügt. Schau dir mal #14 an , was würdest Du da nehmen ohne das Du das Ergebniß vorher kennst. Eventuell gerätst Du in eine Endlosschleife aus der Du nicht mehr rauskommst und dann ist Dein System blokiert.