die fakultät Funktion,und das quit, habe ich da eingebaut ☺
Sehr gut! Eigeninitiative wird von Lehrenden meist positiv gesehen (persönliche Erfahrung aus meiner Jugendzeit). Aber hast Du das auch mal mit negativen Zahlen versucht? gdr
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Sehr gut! Eigeninitiative wird von Lehrenden meist positiv gesehen (persönliche Erfahrung aus meiner Jugendzeit). Aber hast Du das auch mal mit negativen Zahlen versucht? gdr |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 1088 Wohnort: Belgien |
Ja gerade, ergibt segmentation fault...würde eine fakultät mit neg Zahlen Sinn machen? Aber ja hast recht..auf die schnelle fällt mir nur sowas ein, löst das Problem aber nicht wirklich eher verschlimmbessert:
Ich bekomm es aber nicht hin wieder fak so umzubauen das wieder plus rauskommt ☹ Ich merk auch gerade das es nur bei geraden Zahlen funktioniert... |
||||
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Fakultät ist für negative Zahlen nicht definiert. Ich würde die Fehlerprüfung in die fak() Methode einbauen, etwa so:
Du könntes an der Stelle natürlich auch eine Exception werfen, falls das schon behandelt wurde. |
||||
Anmeldungsdatum: Beiträge: 2123 Wohnort: Gelsenkirchen |
Für negative Zahlen kann man entweder eine Ausnahme werfen (wie schon geschrieben wurde) oder NAN ("Not a number") liefern. C++ kennt das wohl als Funktion und als Makro. Habe aber zu wenig Ahnung, um sagen zu können, was sinnvoller ist. |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 1088 Wohnort: Belgien |
Ja und nein, ich hab in den Link reingeschaut, in einer Gamma Funktion gibt es negative Zahlen.
Hab das gemacht, aber wenn wir ehrlich sind umgeht das if ja nur das eigentliche Problem: -3! = -6, und -4! = 24 ...usw. |
||||
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Das sehe ich etwas anders, aber da kann man natürlich unterschiedlicher Meinung sein. Die klassische Fakultätsfunktion ist nur für ganze positive Zahlen und 0 definiert. Die Γ Funktion ist eine eigene Funktion, die anders berechnet werden muss, was ich mir jetzt so aus dem Stand nicht zutrauen würde. Die kannte ich bisher auch gar nicht. Eigentlich müsstest Du auch prüfen, ob die Eingabe eine ganze Zahl ist oder den Wert stillschweigend umwandeln. Das ist zwar eine interessante Problemstellung, aber ich würde die erstmal zurückstellen und in dem Buch weiter arbeiten. Oder hast Du den benötigten Algorithmus schon griffbereit? Dann her damit. |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 1088 Wohnort: Belgien |
Nee, das ist mir dann auch zuviel. Aber könnte man nicht einfach eine eigene -Fakultät Funktion im Programm reinklatschen:i*-fak(i-1)
|
||||
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Schade 😉
Ich würde das dann als automatische Korrektur einer fehlerhaften Eingabe verkaufen. |
||||
Projektleitung
Anmeldungsdatum: Beiträge: 12801 |
Ja, aber Rekursion ist oft recht ineffizient. Ich würde eher so etwas machen:
Aber noch besser ist natürlich eine Exception statt |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 1088 Wohnort: Belgien |
Ja das klappt auch, er gibt dann aber bei negativen Zahlen immer -1 zurück,oder dann die exception. Hier das würde dann immer korrekt rechnen,glaub ich wenigstens(es sei Dakuan findet doch noch was 😛 )
Und das Komma Problem habe ich vorerst so gelöst, ich weiss aber nicht ob sowas unsauber ist aber mir fiel nichts anderes ein..google hat mir auch nicht geholfen,wollte zuerst mit typeid(left).name() Vergleichen, aber das hat auch nicht geholfen, weil ja nur ausgelesen wird um welchen Datentyp es geht. Das hier funktioniert bei mir:
|
||||
Projektleitung
Anmeldungsdatum: Beiträge: 12801 |
Genau, weil das eine Fehlersituation ist.
Das berechnet nicht korrekt die Fakultät, weil die Fakultät für Zahlen < = 0 nicht definiert ist. Da ist egal, ob Du das mit Rekursion oder Iteration löst. Abgesehen davon, benutzt Du fälschlicherweise
s.o.
Aber wozu? Abgesehen davon, ist das völlig unvollständig. |
||||
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Ich habe nichts mehr gefunden und eine bessere Lösung habe ich auch nicht. |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 1088 Wohnort: Belgien |
Ok das könnte man ja ganz schnell abändern, ich hab einfach mit dem Taschenrechner vorgerechnet: -3!=-3*-2*-1=-6 -4!=-4*-3*-2*-1=24
Ich verstehe nicht was Du meinst?Meinst Du Float in dem cast? das hatte ich heute Vormittag schon in Int geändert,da es Probleme mit Zahlen zb:0.5/1.5 usw..
Wozu: um das segmentation fault abzufangen. Wieso ist das Unvollständig? left ist ein double, ich wollte nicht wieder das ganze Programm hier reinpasten..oder meinst Du was anderes? Wenn Du jetzt eine komma Zahl eintippst(nur für fakultät) dann gibt der eine Fehlermeldung und das Programm läuft weiter,wenn ich das nicht static_cast<int>(left)vergleiche, bekomm ich ein segmentation fault und das Programm bricht ab. Wie würde man das denn sauber Codieren? es muss ja irgendwie Erkannt werden wenn der Benutzer eine Komma Zahl eintippt, und das auch nur für die Funktion Fakultät. |
||||
Projektleitung
Anmeldungsdatum: Beiträge: 12801 |
Der Punkt ist: jegliche Eingaben für die Fakultätsfunktion, die kleiner oder gleich Null sind, sind ungültig. Dafür ist die Fakultät nicht definiert. Deshalb ja in meinem Beispiel der Rückgabewert -1 - der zeigt diesen Fehler an.
Sorry, ich meinte
Wenn der Segfault wegen des zu großen Stacks auftritt, dann hast Du einen weiteren Grund, warum man die Fakultät nicht rekursiv berechnen sollte. Was Du da ansonsten in dem Schnipsel machst, ergibt für mich keinen Sinn.
Ja, ist halt immer schwierig, Programmcode zu verstehen und kommentieren, wenn man nur Fetzen sieht. Wenigstens sollte es ein SSCCE sein.
Die Funktion für Fakultät sollte gar keine Fließkommazahlen als Typen unterstützen - weder für die Eingabe noch für die Ausgabe! Da kann ich mich nur wiederholen. Die Prüfung, ob der Nutzer eine Eingabe gemacht hat, die eine Ganzzahl repräsentiert, sollte man außerhalb machen und im Fehlerfall gar nicht erst die Fakultät aufrufen. Also z.B. mit einer Funktion
Dann
|
||||
Anmeldungsdatum: Beiträge: 6339 Wohnort: Hamburg |
Ich denke nicht, das die Rekursionstiefe bei zulässigen Werten ein Problem ist. Der Segfault tritt wohl auf, weil die Rekursion bei ungültigen Werten nicht endet. Ansonsten habe ich hier mal 2 Testergebnisse: manfred@samurai:~/prog/cli/div$ ./fak 170 Ergebnis: 7257415615307994045399635715589591467896184117242257803405544211755693246215271577444614997868077640013184176271985826801597743247247979077995336619429980685793285768053360886112149825437081356365699043287884614002788490694530469661753007801896962563721104619242357348735986883814984039817295623520648167424.000000 manfred@samurai:~/prog/cli/div$ ./fak 171 Ergebnis: inf Kommt ohne merkbare Verzögerung. Ob das Ergebnis richtig ist, habe ich jetzt aber nicht überprüft 😉 Bei Rekursion fällt mit die Ackermannfunktion Funktion ein. Die hatte ich früher mal auf einem Z80 System ausprobiert. Der wollte damals schon bei lächerlich kleinen Zahlen nicht mehr. |