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 * c
negatif bir sayıya taşar.
Ben aslında o kadar eklersiniz aritmetik kontrol arasındaki fark a / (b * c)
ve (a / b) / c
bir programı arasındaki fark olabilir eserler ve bir program çöker söyledi. Bir tamsayının çarpımı b
ve c
bir 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 ) / c
ilk ö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 qt
ve şunu elde ederiz:
q2 * b * c + b * r2 + r3 == a
nerede 0 <= r2 < c
ve 0 <= r3 < b
.
Aynı olan iki şey birbirine eşittir.
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
q1 == q2 + x
Bir 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
x
Sı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 x
sıfırdan büyük olamaz.
Can x
sıfırdan küçük olması? Hayır, benzer bir argümanla okuyucuya bırakılmıştır.
Bu nedenle tamsayı x
sıfırdır ve bu nedenle q1 == q2
.