Termination
-
Warum terminiert folgender Algorithmus für alle a,b?
void m3(int a, int b) { for (; a<=b; a++) { b+=a; } }
b wäre ja immer größer als a (z.b. für b > a und a > 0 am Anfang), also muss der Überlauf eine Rolle spielen, aber wie?
-
ich nehme mal a,b in [-intmax/2 + 1, intmax/2] an. Wenn nach dem "while" b < 1 ist, terminiert es beim nächsten Durchgang wegen b < 1 --> b-a < 1 --> b-a+1 < 1 ==> b < a. nach maximal intmax Schritten ist aber einmal a = intmax/2 und wenn bis dahin immer noch b >= 1 ist, ist im nächsten Schritt b < 1.
Stimmt das? (Problem mit den Ungleichungen bei modulo)
Wie schreibe ich das im Hoare-Kalkül?
-
*push*
-
fraage schrieb:
b wäre ja immer größer als a (z.b. für b > a und a > 0 am Anfang), also muss der Überlauf eine Rolle spielen, aber wie?
Ja, ich vermute auch, daß der Überlauf "schuld" ist - wenn b über INT_MAX wachsen würde, springt es um auf INT_MIN (=-INT_MAX-1), und schon hast du die Situation a>b (a ist (noch) nicht übergelaufen, b liegt irgendwo im Negativ-Bereich) und die Schleife bricht ab
-
CStoll schrieb:
fraage schrieb:
b wäre ja immer größer als a (z.b. für b > a und a > 0 am Anfang), also muss der Überlauf eine Rolle spielen, aber wie?
Ja, ich vermute auch, daß der Überlauf "schuld" ist - wenn b über INT_MAX wachsen würde, springt es um auf INT_MIN (=-INT_MAX-1)
sicher, dass der auf INT_MIN geht und nicht das Ergebnis modulo genommen wird?
-
Wie wär es, wenn ihr euch einfach den Wert von ~0+1 mal ausgeben lasst, anstatt hier fleißig (falsche) Vermutungen anzustellen?
-
fraage schrieb:
sicher, dass der auf INT_MIN geht und nicht das Ergebnis modulo genommen wird?
relativ sicher - so funktioniert die Modulo-Arithmetik in C: INT_MAX+1 == INT_MIN (für unsigned: UINT_MAX+1 == 0)
PS: sarfuan's Vorschlag klingt sicher hilfreich - bau mal ein "cout<<a<<' '<<b<<endl;" bzw. "printf("%d %d\n",a,b);" in die Schleife ein und beobachte, wie sich die Werte entwickeln.
-
CStoll schrieb:
fraage schrieb:
sicher, dass der auf INT_MIN geht und nicht das Ergebnis modulo genommen wird?
relativ sicher - so funktioniert die Modulo-Arithmetik in C: INT_MAX+1 == INT_MIN (für unsigned: UINT_MAX+1 == 0)
ja, das bezweifle ich ja nicht, aber INT_MAX + 100 ist z.b. größer als INT_MIN
-
aber nicht in c++
-
long int schrieb:
aber nicht in c++
echt? bei meinem g++ 4.0.2 ist das so