Seite 1 von 1

Theorietestat #2: pow

Verfasst: 16. Mai 2017 11:29
von Macavity
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?

Re: Theorietestat #2: pow

Verfasst: 16. Mai 2017 15:38
von invariant
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ß

Re: Theorietestat #2: pow

Verfasst: 20. Mai 2017 21:53
von LukasPhysiker
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.

Re: Theorietestat #2: pow

Verfasst: 22. Mai 2017 14:44
von LordMaddhi
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)

Re: Theorietestat #2: pow

Verfasst: 22. Mai 2017 21:09
von LukasPhysiker
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.

Re: Theorietestat #2: pow

Verfasst: 23. Mai 2017 13:11
von invariant
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ß