Theorietestat #2: pow

Bei Postings zu Aufgabe Nr. x auf Blatt Nr. y lassen Sie Ihr Betreff bitte mit "y.x: " beginnen, gefolgt von einer möglichst präzisen Überschrift, danke!

Moderator: Algorithmen und Datenstrukturen

Forumsregeln
Bei Postings zu Aufgabe Nr. x auf Blatt Nr. y lassen Sie Ihr Betreff bitte mit "y.x: " beginnen, gefolgt von einer möglichst präzisen Überschrift, danke!
Macavity
Windoof-User
Windoof-User
Beiträge: 27
Registriert: 27. Apr 2015 19:56

Theorietestat #2: pow

Beitrag von Macavity » 16. Mai 2017 11:29

Bei mir scheitert pow schon an der Wohldefiniertheit:

for (int i = 0; i =< exponent; i++)
müsste sein
for (int i = 0; i <= exponent; i++)

Ist das Absicht, und das, was wir "beweisen" sollen?

invariant
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 6. Mai 2017 19:01

Re: Theorietestat #2: pow

Beitrag von invariant » 16. Mai 2017 15:38

Das ist kein geplanter Fehler. Die Verbesserung ist korrekt - aber das sollte dem Compiler schon auffallen und solche Fehler sind eigentlich nicht der Plan.
Gehen Sie davon aus, dass da <= statt =< steht. Wird verbessert - danke für den Hinweis.

Es ist allerdings ein weiterer logischer Fehler im Algorithmus enthalten, der im Korrektheitsbeweis erkannt werden soll.

Gruß

LukasPhysiker
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 111
Registriert: 6. Mai 2017 13:05

Re: Theorietestat #2: pow

Beitrag von LukasPhysiker » 20. Mai 2017 21:53

Sehe ich das richtig, dass der Logikfehler einfach sein soll, dass nicht beachtet wird, dass Basis und Exponent gleichzeitig 0 sein können? Oder geht es hier auch um Überläufe, die nicht abgefangen werden? Jedenfalls ist 0^0 nicht definiert. b^0 und 0^e scheinen mir ansonsten korrekt behandelt.

Benutzeravatar
LordMaddhi
Nichts ist wie es scheint
Beiträge: 23
Registriert: 20. Apr 2017 11:57
Wohnort: Darmstadt, Hessen

Re: Theorietestat #2: pow

Beitrag von LordMaddhi » 22. Mai 2017 14:44

Ich glaube die weiteren Fehler sind folgende:
- bei der for-Schleife wird eine Iteration zu viel gemacht, sollte eher i < exponent heißen, z.B. ist 2^5 = 32, hier aber 64.

- möglicher arithmetischer Überlauf bei:
- i (wenn exponent > Integer.MAX_VALUE)
- result (wenn base > Integer.MAX_VALUE)
(Kann man aber durch Änderung der Vorbedingung ausschließen)
Ich bin nicht die Signatur. Ich putze hier nur.

LukasPhysiker
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 111
Registriert: 6. Mai 2017 13:05

Re: Theorietestat #2: pow

Beitrag von LukasPhysiker » 22. Mai 2017 21:09

Hmm, in der PDF, die ich Vorliegen habe (v7) steht da schon "i < exponent". Steht bei dir da <=? Klingt so, als ob zusätzlich zu den absichtlichen Fehlern noch ein unabsichtlicher Fehler drin war, der mittlerweile korrigiert wurde...

Ich stimme jedenfalls zu, dass result überlaufen kann, aber i kann es meiner Meinung nach nicht, denn exponent kann ja nicht größer als Integer.MAX_VALUE sein, weil es ja selbst eine int ist.

invariant
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 6. Mai 2017 19:01

Re: Theorietestat #2: pow

Beitrag von invariant » 23. Mai 2017 13:11

In meiner Version steht immer noch =< (Version 7) - wie gesagt da sollte eigentlich <= stehen, ist beim Tippen nur falsch herum passiert. In der nächsten Version wird das korrigiert.

Als kleiner Hinweis überlegen Sie was bei b^0 herauskommen sollte. Was den Logikfehler angeht. Es gibt hier auch mehrere mögliche Ansätze das zu reparieren.

Überläufe gehören natürlich auch dazu (Wohldefiniertheit bzw. Input)

Gruß

Antworten

Zurück zu „AuD: Theoretische Aufgaben“