Discussione:
Divisione: quoziente e resto
(troppo vecchio per rispondere)
danza
2007-03-24 16:36:14 UTC
Permalink
Qualcuno saprebbe spiegarmi perché Python invece che seguire la
definizione matematica di quoziente e resto che prevede che il resto
sia sempre positivo, ha scelto una convenzione diversa ponendo il
resto con lo stesso segno del divisore, convenzione per altro diversa
dai linguaggi precedenti come Pascal, C che danno al resto lo stesso
segno del dividendo?

Definizione matematica:

14 / 3 --> q = 4 r = 2
14 /-3 --> q =-4 r = 2
-14 / 3 --> q =-5 r = 1
-14 /-3 --> q = 5 r = 1

Python:

14 / 3 --> q = 4 r = 2
14 /-3 --> q =-5 r =-1
-14 / 3 --> q =-5 r = 1
-14 /-3 --> q = 4 r =-2

Da matematico, non mi sembra carino che i linguaggi di programmazione
utilizzino convenzioni diverse da quella matematica, e peggio ancora
diverse tra di loro. Mi sembra fonte di notevole confusione.

Daniele
b***@lycos.com
2007-03-24 17:12:44 UTC
Permalink
Post by danza
Da matematico, non mi sembra carino che i linguaggi di programmazione
utilizzino convenzioni diverse da quella matematica, e peggio ancora
diverse tra di loro. Mi sembra fonte di notevole confusione.
Non so risponderti perche' in questo caso Python si comporti in questo
modo insolito, comunque in generale i linguaggi di programmazione sono
oggetti pratici, che devono sottostare ad un numero molto elevato di
limitazioni e ottimizzazioni pratiche, per cui spesso (in certi
linguaggi piu' che in altri) la praticita' e' preferita alla
correttezza formale. A quanto pare parecchi progettisti di linguaggi
non riconoscono il primato alla matematica (e non si sentono neanche
legati a cosa i matematici considerino carino o a cosa altri
progettisti di linguaggi abbiano fatto prima di loro). Comunque spesso
Python non si comporta male, ad esempio se fai la somma tra due numeri
interi molto grandi ottieni il risultato giusto, e non un qualche
modulo a seconda della precisione degli interi di macchina che si
stanno usando ;-)

Ciao,
bearophile
Giovanni Bajo
2007-03-24 18:45:32 UTC
Permalink
Post by danza
Qualcuno saprebbe spiegarmi perché Python invece che seguire la
definizione matematica di quoziente e resto che prevede che il resto
sia sempre positivo, ha scelto una convenzione diversa ponendo il
resto con lo stesso segno del divisore, convenzione per altro diversa
dai linguaggi precedenti come Pascal, C che danno al resto lo stesso
segno del dividendo?
*Penso* per poter definire in maniera consistente la divisione intera:

a // b == floor(a / b)

(dove il significato degli operatori è quello dopo aver eseguito "from
__future__ import division", cioé "/" indica la divisione nel dominio dei reali.)
--
Giovanni Bajo
Lawrence Oluyede
2007-03-24 22:43:09 UTC
Permalink
Post by danza
Da matematico, non mi sembra carino che i linguaggi di programmazione
utilizzino convenzioni diverse da quella matematica, e peggio ancora
diverse tra di loro. Mi sembra fonte di notevole confusione.
Io mi sono scontrato con un problema similare l'anno scorso mentre
facevo il SoC per pypy:

<http://www.oluyede.org/blog/2006/06/02/mod-is-not-mod/>
--
Lawrence, oluyede.org - neropercaso.it
"It is difficult to get a man to understand
something when his salary depends on not
understanding it" - Upton Sinclair
Andrea Laforgia
2007-03-24 23:25:49 UTC
Permalink
[...]convenzione per altro diversa
dai linguaggi precedenti come Pascal, C che danno al resto lo stesso
segno del dividendo?
Non è detto che sia diversa. Queste questioni sono dipendenti
dall'implementazione, quindi la convenzione potrebbe essere la stessa,
al variare di piattaforme e compilatori. In ogni caso, concordo sul
discorso di fondo ;-)
Alex Martelli
2007-03-25 00:17:11 UTC
Permalink
Post by Andrea Laforgia
[...]convenzione per altro diversa
dai linguaggi precedenti come Pascal, C che danno al resto lo stesso
segno del dividendo?
Non è detto che sia diversa. Queste questioni sono dipendenti
dall'implementazione, quindi la convenzione potrebbe essere la stessa,
al variare di piattaforme e compilatori. In ogni caso, concordo sul
discorso di fondo ;-)
La questione fu discussa abbastanza a fondo nel thread
<http://mail.python.org/pipermail/python-list/2001-August/100794.html>
(per qualche ragione il thread si e` "spezzato" e tre messaggi sono
finiti a
<http://mail.python.org/pipermail/python-list/2001-August/100893.html>,
comunque con lo stesso subject).

Come spiega Tim Peters nel suo primo messaggio del thread: lo standard C
classico lasciava il segno indeterminato ("qualunque cosa faccia la
macchina, andra` bene" -- il principio #5 dello "Spirito del C" nella
prefazione allo Standard), quello C moderno (C99) invece lo specifica --
e lo specifica "sbagliato" per compatibilita` col Fortran. Python ha
molto presto invece scelto di implementare col % il "modulo" matematico
(se b>0, a % b e` pure > 0 per qualsiasi a).


Alex
danza
2007-03-25 07:19:21 UTC
Permalink
Post by Alex Martelli
La questione fu discussa abbastanza a fondo nel thread
<http://mail.python.org/pipermail/python-list/2001-August/100794.html>
(per qualche ragione il thread si e` "spezzato" e tre messaggi sono
finiti a
<http://mail.python.org/pipermail/python-list/2001-August/100893.html>,
comunque con lo stesso subject).
Interessanti...
Post by Alex Martelli
Come spiega Tim Peters nel suo primo messaggio del thread: lo standard C
classico lasciava il segno indeterminato ("qualunque cosa faccia la
macchina, andra` bene" -- il principio #5 dello "Spirito del C" nella
prefazione allo Standard), quello C moderno (C99) invece lo specifica --
e lo specifica "sbagliato" per compatibilita` col Fortran. Python ha
molto presto invece scelto di implementare col % il "modulo" matematico
(se b>0, a % b e` pure > 0 per qualsiasi a).
Python implementa il modulo "matematico" solo se il divisore è
positivo, si comporta in modo diverso se il divisore è negativo...
Questa scelta non mi è ancora ben chiara.

Grazie, ciao

Daniele
Andrea Laforgia
2007-03-25 12:13:32 UTC
Permalink
[...]Python ha
molto presto invece scelto di implementare col % il "modulo" matematico
(se b>0, a % b e` pure > 0 per qualsiasi a).
E se b<0 ?
L'OP afferma, da quanto ho capito, che il modulo matematico richieda
il resto positivo in ogni caso.
Pablo Xon
2007-03-25 14:42:57 UTC
Permalink
Ciao,
Post by danza
Qualcuno saprebbe spiegarmi perché Python invece che seguire la
definizione matematica di quoziente e resto che prevede che il resto
sia sempre positivo, ha scelto una convenzione diversa ponendo il
resto con lo stesso segno del divisore, convenzione per altro diversa
dai linguaggi precedenti come Pascal, C che danno al resto lo stesso
segno del dividendo?
Non e' un "problema" solo di Python, riguarda anche altri linguaggi e
svariati sw (es. OpenOffice.org).
Qui viene un po' "circostanziato" il problema:
http://utenti.quipo.it/base5/numeri/divquotresto.htm

L'importante a' saperlo... :-)

Ciao,
Paolo
Enrico 'Mc Osten' Franchi
2007-03-28 23:06:56 UTC
Permalink
Post by danza
Da matematico, non mi sembra carino che i linguaggi di programmazione
utilizzino convenzioni diverse da quella matematica, e peggio ancora
diverse tra di loro.
I linguaggi di programmazione usano *costantemente* convenzioni diverse
da quelle da matematica (e pure i matematici usano convenzioni diverse
gli uni dagli altri).

Non tutti i formalismi sono ugualmente buoni per fare certe cose.
--
blog: http://www.akropolix.net/rik0/blogs | Uccidete i filosofi,
site: http://www.akropolix.net/rik0/ | tenetevi riso e
forum: http://www.akropolix.net/forum/ | bacchette per voi.
Andrea Laforgia
2007-03-29 14:35:14 UTC
Permalink
Post by Enrico 'Mc Osten' Franchi
I linguaggi di programmazione usano *costantemente* convenzioni diverse
da quelle da matematica
..per ragioni specifiche, immagino. Qual è la ragione specifica per non
usare il resto come definito dalla matematica?
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Enrico 'Mc Osten' Franchi
2007-03-29 16:30:30 UTC
Permalink
Post by Andrea Laforgia
..per ragioni specifiche, immagino. Qual è la ragione specifica per non
usare il resto come definito dalla matematica?
È stata ampiamente spiegata nel thread postato da Alex.
--
blog: http://www.akropolix.net/rik0/blogs | Uccidete i filosofi,
site: http://www.akropolix.net/rik0/ | tenetevi riso e
forum: http://www.akropolix.net/forum/ | bacchette per voi.
danza
2007-04-03 19:19:14 UTC
Permalink
Post by Enrico 'Mc Osten' Franchi
È stata ampiamente spiegata nel thread postato da Alex.
probabilmente è per il mio povero inglese, ma io ho letto un'ampia
discussione sulla questione, ma non ho trovato le motivazioni della
scelta.

Comunque la cosa non ha una grande importanza, era solo una
curiosità...

Ciao

Daniele

Loading...