PDA

View Full Version : ma com'è possibile!??!?!


akyra
09-11-2005, 17:39
scusate tanto per la banalità della discussione, ma l'operatore di modulo, che in java è indicato con %, non dovrebbe restituire il resto della divisione tra 2 numeri?
dato che la risposta è sì, allora perchè scrivendo in java queste istruzioni il valore che viene assegnato alla variabile g è -1????

int g = -1;
g = g % 3;

non dovrei avere 2???????
non riesco proprio a ciper perchè mi assegni -1.....

r.
09-11-2005, 17:53
Perchè -1 = 0*3 + (-1) e non (-1)*3+2

Alvaro Vitali
09-11-2005, 17:55
ora sparo:

-1 diviso 3 è 0 col resto di -1

:D

akyra
09-11-2005, 18:04
scusa ma allora cosa devo fare per ottenere correttamente l'operazione di modulo??
cioè l'operazione mi da un risultato positivo solo se il numero a sinistra dell'operazione è positivo?

max246
09-11-2005, 18:17
scusa ma allora cosa devo fare per ottenere correttamente l'operazione di modulo??
cioè l'operazione mi da un risultato positivo solo se il numero a sinistra dell'operazione è positivo?

no devi fare questa operazione in una sola...

akyra
09-11-2005, 18:24
vabbè ci posso mettere un "if" che controlla se il valore della variabile è negativo, e se lo è esegue (3 + g) in modo tale da ottenere quello che mi serve...

mi sembra un po' strano però in quanto, ad es., sulla calcolatrice se faccio il modulo di un numero negativo mi da come risultato il valore positivo, che non a caso appartiene alla stessa classe di equivalenza del risultato negativo, come mai per il java questo non funziona??

max246
09-11-2005, 18:33
non vorrei dire un caxxata... ma forse non è per il fatto che non sia Float? ... forse con INT non gli piace i numeri sotto lo zero ;D

r.
09-11-2005, 18:55
In effetti (vedi http://functions.wolfram.com/IntegerFunctions/Mod/02/)

n%m deve avere lo stesso segno di m (se non è zero).

Da qui http://mindprod.com/jgloss/modulus.html
sembrebbe quasi un baco di java.

fuocofatuo
09-11-2005, 19:14
Non può che essere un baco, dato che, per definizione, il resto di una divisione tra a e b (con a e b in Z, b>0) è il naturale c: b>c>=0. Di conseguenza, -1 diviso 3 è -1 con resto 2.

Alvaro Vitali
09-11-2005, 19:30
mi sembra un po' strano però in quanto, ad es., sulla calcolatrice se faccio il modulo di un numero negativo mi da come risultato il valore positivo, che non a caso appartiene alla stessa classe di equivalenza del risultato negativo, come mai per il java questo non funziona??


scusa ma cosa c'entra la funzione modulo con l'operatore modulo (cioè resto) ? :confused:

71104
09-11-2005, 20:08
Non può che essere un baco, dato che, per definizione, il resto di una divisione tra a e b (con a e b in Z, b>0) è il naturale c: b>c>=0. Di conseguenza, -1 diviso 3 è -1 con resto 2. cavolo, avete scoperto un errore di Java!!! :confused:
ma com'è implementato in Java l'operatore %?? non si usa la ALU dell'architettura ospite? :confused:
l'errore riguarda anche il C++ e/o l'assembly?

fuocofatuo
09-11-2005, 20:23
Ok, hai ragione. Ho decisamente sbagliato a chiamarlo baco, essendo preso un po' dalla fretta...

Ciò che intendevo dire è che se l'operatore intende fornire il resto di una divisione generica tra interi, il risultato proposto è matematicamente sbagliato. Non c'è verso, e il fatto che me la fornisca l'ALU anzichè ne so io chi, non cambia certo le cose.

akyra
10-11-2005, 08:50
Ok, hai ragione. Ho decisamente sbagliato a chiamarlo baco, essendo preso un po' dalla fretta...

Ciò che intendevo dire è che se l'operatore intende fornire il resto di una divisione generica tra interi, il risultato proposto è matematicamente sbagliato. Non c'è verso, e il fatto che me la fornisca l'ALU anzichè ne so io chi, non cambia certo le cose.

non è che sia sbagliato, in quanto se creo una classe di equivalenza modulo 3, allora creo un insieme così definito:

[a] = {x | x modulo 3 = a, con x che appartiene agli Interi}

giusto?
di conseguenza le classi di equivalenza modulo 3 saranno: [0], [1], [2].
Non importa quale rappresentate prenda di ognuna di queste classi, in quanto ad esempio [2]=[8] ,oppure [-1]=[2].
Di conseguenza il risultato -1 è corretto, ma dato che [-1]=[2] allora il rusultato che dovrei avere è 2.
Quindi se è ragionevole che l'operazione di modulo mi restituisca come risultato la classe di appartenenza (positiva) del resto, come mai in Java questo non è scontato, invece sulla calcolatrice sì?

0rph3n
10-11-2005, 09:09
scusa ma cosa c'entra la funzione modulo con l'operatore modulo (cioè resto) ? :confused:
:stordita: manco io ho capito cosa centrano! :confused:

'iao

akyra
10-11-2005, 11:08
ma chi ha parlato di funzioni?
sto dicendo che l'operatore di modulo sulla calcolatrice mi da sempre risultato positivo, indipendentemente se il dividendo sia positivo o negativo, invece in Java mi da un numero negativo se il dividendo è anch'esso negativo...quando invece sarebbe ragionevole che mi desse un numero positivo, per i motivi che ho detto sopra...

0rph3n
10-11-2005, 11:14
ma chi ha parlato di funzioni?
sto dicendo che l'operatore di modulo sulla calcolatrice mi da sempre risultato positivo, indipendentemente se il dividendo sia positivo o negativo, invece in Java mi da un numero negativo se il dividendo è anch'esso negativo...quando invece sarebbe ragionevole che mi desse un numero positivo, per i motivi che ho detto sopra...
mi sembra un po' strano però in quanto, ad es., sulla calcolatrice se faccio il modulo di un numero negativo mi da come risultato il valore positivo,
scusa ma questa frase era un po' ambigua!

'iao

0rph3n
10-11-2005, 11:20
ma il resto che ti restituisce, non considerando la negatività, è corretto?
se così fosse basterebbe fare il...
...modulo del modulo :D

'iao

Alvaro Vitali
10-11-2005, 14:01
Per modulo si può intendere la funzione "valore assoluto", da quello che avevi scritto sembrava tu stessi parlando di modulo come valore assoluto e non di modulo come resto di una divisione. (quando parlavi dei conti con la calcolatrice).

...ovviamente la funzione modulo (valore assoluto) restituisce sempre un valore positivo...

jappilas
10-11-2005, 14:17
scusa ma allora cosa devo fare per ottenere correttamente l'operazione di modulo??
cioè l'operazione mi da un risultato positivo solo se il numero a sinistra dell'operazione è positivo?
non "se il numero a sinistra è positivo" ma se dividendo e divisore hanno segno concorde

A / B = A* (1/B) = risultato
risultato = segno * valore , con valore = parte_intera+resto
e segno = + se A e B hanno stesso segno, - in caso di segno diverso, come per qualunque moltiplicazione

è algebra eh.... :rolleyes:

71104
10-11-2005, 19:01
Ok, hai ragione. Ho decisamente sbagliato a chiamarlo baco, essendo preso un po' dalla fretta...

Ciò che intendevo dire è che se l'operatore intende fornire il resto di una divisione generica tra interi, il risultato proposto è matematicamente sbagliato. Non c'è verso, e il fatto che me la fornisca l'ALU anzichè ne so io chi, non cambia certo le cose. comunque guarda che non stavo facendo ironie, ho capito, si tratta di un errore, baco, chiamalo come vuoi... ^_^'

fuocofatuo
10-11-2005, 19:19
Scusa te.. ma tra festa, poco sonno e studio sto diventando un po' distratto..

r.
10-11-2005, 21:54
Io ho cercato un po' su google e la situazione è questa:

i matematici definiscono l'operazione binaria modulo nel senso inteso da akyra (x%n è sempre dello stesso segno di n), mentre le implementazioni nei linguaggi di programmazione (dal fortran in poi) l'hanno "confusa" con l'operazione "resto", che si comporta appunto come risulta a akyra.

Detto questo, credo che (a%n+n)%n restituisca sempre l'operazione modulo.