Diese Frage hat mir so gut gefallen, dass ich sie am 4. Juni 2013 zum Thema meines Blogs gemacht habe . Danke für die tolle Frage!
Große Koffer sind leicht zu bekommen. Beispielsweise:
a = 1073741823;
b = 134217727;
c = 134217727;
weil b * c
überläuft auf eine negative Zahl.
Ich würde dem die Tatsache hinzufügen, dass in der überprüften Arithmetik der Unterschied zwischen a / (b * c)
und (a / b) / c
ein Unterschied zwischen einem funktionierenden Programm und einem abstürzenden Programm sein kann. Wenn das Produkt von b
und c
die Grenzen einer Ganzzahl überschreitet, stürzt die erstere in einem überprüften Kontext ab.
Für kleine positive ganze Zahlen, die beispielsweise klein genug sind, um in einen Kurzschluss zu passen, sollte die Identität beibehalten werden.
Timothy Shields hat gerade einen Beweis veröffentlicht. Ich präsentiere hier einen alternativen Beweis. Angenommen, alle Zahlen hier sind nicht negative Ganzzahlen und keine der Operationen läuft über.
Die ganzzahlige Division von x / y
findet den Wert q
so, dass q * y + r == x
, wo 0 <= r < y
.
Die Division a / (b * c)
findet also den Wert q1
so, dass
q1 * b * c + r1 == a
wo 0 <= r1 < b * c
Die Division ( a / b ) / c
findet zuerst den Wert qt
so, dass
qt * b + r3 == a
und findet dann den Wert q2
so, dass
q2 * c + r2 == qt
Ersetzen Sie das durch qt
und wir erhalten:
q2 * b * c + b * r2 + r3 == a
wo 0 <= r2 < c
und 0 <= r3 < b
.
Zwei Dinge, die gleich sind, sind einander gleich, also haben wir
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
Angenommen, q1 == q2 + x
eine ganze Zahl x
. Ersetzen Sie das in und lösen Sie für x
:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
wo
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
Kann x
größer als Null sein? Nein, wir haben die Ungleichungen:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Der Zähler dieses Bruchs ist also immer kleiner als b * c
und x
kann daher nicht größer als Null sein.
Kann x
kleiner als Null sein? Nein, durch ein ähnliches Argument dem Leser überlassen.
Daher ist die Ganzzahl x
Null und daher q1 == q2
.