2010-04-14 15 views
7

hält die folgende ganzzahlige arithmetische Eigenschaft?ganzzahlige Division Eigenschaften

Zuerst dachte ich, ich wüsste Antwort (hält nicht), aber jetzt bin ich mir nicht sicher. Kann es für alle Nummern oder nur für bestimmte Bedingungen gelten, d. H. n > l?

Die Frage bezieht sich auf Computerarithmetik, nämlich q = n/m, q*m != n, Überlauf zu ignorieren.

+0

Interessieren Sie Rand Fälle wie Überläufe? Oder seltsame Architekturen/Sprachen wie jene, in denen 'n/m' statt auf Null abgerundet wird? –

Antwort

12
Case1 assume m = kn+b (b<n), 
left = (m/n)/l = ((kn+b)/n)/l = (k+b/n)/l = k/l (b/n=0, because b<n) 
right = (kn+b)/(n*l) = k/l + b/(n*l) = k/l (b/(n*l)=0, because b<n) 
=> left = right 

Case2 assume m = kn, 
left = (m/n)/l = (kn/n)/l = k/l 
right = kn/(n*l) = k/l 
=> left = right 

So, (m/n)/l == m/(n*l) 
+0

Nicht wahr, wenn n * l die Grenze des Integer-Typs überschreitet. – mtrw

+1

@Mtrw fair zu sein, das versteht sich von selbst – Anycorn

+0

@ ziang, @aaa - Ich habe dieses Denken downvoted, dass Überlauf ein wichtiger Teil der Frage war. Jetzt ist mein Downvote zu alt um ihn rückgängig zu machen. Entschuldigung, ziang. – mtrw

5

Sprechen Sie über mathematische Ganzzahlen? Oder Ganzzahlen fester Breite innerhalb einer Programmiersprache?

Die beiden Gleichungen sind identisch mit mathematischen Ganzzahlen, aber die beiden Funktionen haben unterschiedliche Überlaufverhalten, wenn Sie Ganzzahlen mit fester Breite verwenden.

Zum Beispiel suppose ganze Zahlen sind 32-Bit-

(1310720000/65536)/65537 = 20000/65537 = 0 

jedoch 65536 * 65537 wird eine 32-Bit-Integer-Überlauf, und 65536 entsprechen, so

1310720000/(65536*65537) = 1310720000/65536 = 20000 
+0

+1 für mich zu schlagen. Und wenn ich könnte, eine weitere +1 für scheinbar die einzige Antwort auf das Wort Integer! – mtrw