2013-03-26 8 views
5

Aby ustanowić kontekst, mówię tylko o arytmetyce liczb całkowitych, na dużych liczbach całkowitych, więc przejście przez zmiennoprzecinkowe nie jest opcją i użycie liczb ujemnych, więc różnica między podziałką na poziomie wypłaszczonym i obciętym ma znaczenie.Podział na ścięte i wypukłe w Pythonie

Podczas wykonywania podziału na ujemne liczby całkowite, typowy sprzęt i języki programowania rodziny C dają wynik skrócony, np. 1/-2 = 0. Python 2 podaje wynik końcowy, np. 1/-2 = -1.

Niezależnie od argumentów na temat, który jest samoistnie lepszy, czy istnieje sposób, aby Python dał obcinany wynik? Czy robi to jakąś różnicę, jeśli używasz Pythona 3 zamiast 2?

Odpowiedz

7

Ok, jeśli chcesz tylko rozwiązanie, pamiętaj int obcina liczbę, więc zamiast robić całkowitą dzielnik, obciąć pływak z int

int(1./-2) 

Jeśli używasz Pythona 3.x, można po prostu zrobić

int(1/2) 

Jeśli chcesz tego samego zachowania w Py importowej 2.X podziału od przyszłego

from __future__ import division 
int(1/2) 

Jeśli chcesz znać dokładną przyczynę tego zachowania, przeczytaj ten wspaniały artykuł Why Python's Integer Division Floors


patrząc na kłopotliwego w użyciu pacy do podziału, tutaj jest alternatywnym podejściem, które wydaje się działać w miarę Testowałem. Zapraszam do daj mi znać o wszelkich kwestiach stoją

>>> def trunc_div(a,b): 
    q, r = divmod(a,b) 
    if q < 0 and r: 
     q += 1 
    return q 

>>> trunc_div(1,-2) 
0 
>>> trunc_div(999999999999999999999999999999999999999999, -2) 
-499999999999999999999999999999999999999999L 
>>> trunc_div(999999999999999999999999999999999999999999, 2) 
499999999999999999999999999999999999999999L 
>>> trunc_div(1,2) 
0 
>>> 
+0

Spróbuj 'int (100000000000000000000000./2)' ... (maszyna 32-bitowa) –

+0

Jeszcze raz mówię tylko o arytmetyce całkowitej, a nie o zmiennoprzecinkowej. Rozumiem powody, dla których podłoga jest wewnętrznie lepsza, ale jak powiedziałem, to jest inne pytanie; to, czego szukam w tym kontekście, to sposób naśladowania zachowania typowego sprzętu i języków programowania. – rwallace

+0

@rwallace: Zobacz moją aktualizację – Abhijit

1

Python 3 ma podziału w nowym stylu (który może być także uruchamiany w Pythonie 2 z from __future__ import division):

>>> from __future__ import division 
>>> -1/2 
-0.5 
>>> -1 // 2 
-1 

nie sądzę, można uzyskać obcięty podział, to prawdopodobnie masz do wykorzystania matematyki .piętro().

+0

To jest powleczone, nie ścięte. Ponownie mówię tylko o arytmetyce liczb całkowitych, zmiennoprzecinkowe nie są w ogóle zaangażowane. – rwallace

+0

Ach tak, przepraszam, mam je pomieszane. – djc

1

myślę, że to rozwiąże problem, ale jest to wywołanie funkcji, a nie prosta operacja:

def truncdiv(a, b): 
    if a < 0: 
     a = -a 
     b = -b 
    if b < 0: 
     return (a + b + 1)/b 
    return a/b 
0

W gmpy2 obsługuje biblioteki okrojony podział:

>>> import gmpy2 
>>> gmpy2.mpz(-100)//7 
mpz(-15) 
>>> gmpy2.t_div(gmpy2.mpz(-100),7) 
mpz(-14) 
>>> 

Nota prawna: Zachowuję gmpy2.