Bu soruyu o kadar beğendim ki , 4 Haziran 2013 tarihinde blogumun konusu yaptım . Bu mükemmel soru için teşekkürler!
Büyük vakaların gelmesi kolaydır. Örneğin:
a = 1073741823;
b = 134217727;
c = 134217727;
çünkü b * cnegatif bir sayıya taşar.
Ben aslında o kadar eklersiniz aritmetik kontrol arasındaki fark a / (b * c)ve (a / b) / cbir programı arasındaki fark olabilir eserler ve bir program çöker söyledi. Bir tamsayının çarpımı bve cbir tamsayının sınırlarını aşarsa, o zaman birincisi kontrol edilen bir bağlamda çökecektir.
Küçük pozitif tamsayılar için, diyelim ki, kısaca sığacak kadar küçük, kimlik korunmalıdır.
Timothy Shields az önce bir kanıt yayınladı; Burada alternatif bir kanıt sunuyorum. Buradaki tüm sayıların negatif olmayan tam sayılar olduğunu ve işlemlerin hiçbirinin taşmadığını varsayın.
Tamsayı bölümü x / y, değeri qöyle bulur ki q * y + r == x, nerede 0 <= r < y.
Böylelikle bölüm a / (b * c), değeri q1şu şekilde bulur:
q1 * b * c + r1 == a
nerede 0 <= r1 < b * c
bölünme ( a / b ) / cilk önce değeri qtşu şekilde bulur:
qt * b + r3 == a
ve sonra değeri q2öyle bulur ki
q2 * c + r2 == qt
Öyleyse yerine koyun qtve şunu elde ederiz:
q2 * b * c + b * r2 + r3 == a
nerede 0 <= r2 < cve 0 <= r3 < b.
Aynı olan iki şey birbirine eşittir.
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
q1 == q2 + xBir tam sayı için varsayalım x. Bunu yerine koyun ve şunu çözün x:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
nerede
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
xSıfırdan büyük olabilir mi? Hayır. Eşitsizliklerimiz var:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Yani bu kesrin payı her zaman daha küçüktür b * c, dolayısıyla xsıfırdan büyük olamaz.
Can xsıfırdan küçük olması? Hayır, benzer bir argümanla okuyucuya bırakılmıştır.
Bu nedenle tamsayı xsıfırdır ve bu nedenle q1 == q2.