PDA

View Full Version : [generico] multiplo


peter2
11-04-2007, 18:18
indipendentemente dal linguaggio che si usa, come fate a capire se un numero reale x è multiplo di un altro reale y??

usando la funzione mod(x,y) ( qui (http://mathworld.wolfram.com/Mod.html))
nel caso in cui siano effettivamente multipli, mod(x,y) viene 0.9999991 con tanti nove in funzione della precisione che si sta usando.

come fare?

Psylo
11-04-2007, 19:00
conosco solo php (sono agli inizi) e per fare tale verifica uso il "modulo" (%) che ritorna il resto della divisione tra due numeri...quindi se x%y==0 (cioè la divisione tra x e y da' come resto 0..) vuol dire che x è un multiplo esatto di y.

cionci
11-04-2007, 22:26
Attenzione che stiamo parlando di numeri reali...quindi non si fanno mai confronti fra numeri reali (anche lo zero è un numero reale) senza assegnare un certo margine di incertezza...

Ad esempio dati a e b:

c = a * b
c = c * (b - 1)
c = c / b
c = c / (b - 1)

E' molto probabile che a == c ritorni falso...questo è dovuto al fatto che i floating point non sono chiaramente infiniti come i numeri reali e di conseguenza ci possono essere errori di rappresentazione dovuti appunto alla granularità dell'inseme dei floating point.
Ecco perché controllare che:

Mod(a, b) == 0 per affermare che a è multiplo di b è molto rischioso.
E non solo perché Mod(a,b) potrebbe essere 0.000000001, ma anche perché potrebbe essere (b - 0.000000001)
Quindi prima di tutto dobbiamo assegnare un certo margine di incertezza...che so, 1 su 100000.
Quindi per possiamo affermare con un certa sicurezza che a è multiplo di b:

m = mod(a,b)
e = 0.00001 * b <---- errore accettabile dovuto alla rappresentazione

se (m - e) < 0 oppure (m + e) > b allora a è multiplo di b

peter2
11-04-2007, 22:49
Attenzione che stiamo parlando di numeri reali...quindi non si fanno mai confronti fra numeri reali (anche lo zero è un numero reale) senza assegnare un certo margine di incertezza...

Ad esempio dati a e b:

c = a * b
c = c * (b - 1)
c = c / b
c = c / (b - 1)

E' molto probabile che a == c ritorni falso...questo è dovuto al fatto che i floating point non sono chiaramente infiniti come i numeri reali e di conseguenza ci possono essere errori di rappresentazione dovuti appunto alla granularità dell'inseme dei floating point.
Ecco perché controllare che:

Mod(a, b) == 0 per affermare che a è multiplo di b è molto rischioso.
E non solo perché Mod(a,b) potrebbe essere 0.000000001, ma anche perché potrebbe essere (b - 0.000000001)
Quindi prima di tutto dobbiamo assegnare un certo margine di incertezza...che so, 1 su 100000.
Quindi per possiamo affermare con un certa sicurezza che a è multiplo di b:

m = mod(a,b)
e = 0.00001 * b <---- errore accettabile dovuto alla rappresentazione

se (m - e) < 0 oppure (m + e) > b allora a è multiplo di b

esatto, proprio quello che volevo fare io, solo che volevo legare l'incertezza al tipo di rappresentazione fp (4 o 8 bit) e quindi alla precisione, in modo che valga universalmente.

in realtà temo che se a è multiplo di b la distanza di mod(a,b) da 0 (cioè il suo valore) dipenda da a/b stesso, cioè da quanto grande è a rispetto a b.

basta vedere che mod(a,b)=a-b*int(a/b)

Psylo
12-04-2007, 13:00
esatto, proprio quello che volevo fare io, solo che volevo legare l'incertezza al tipo di rappresentazione fp (4 o 8 bit) e quindi alla precisione, in modo che valga universalmente.

in realtà temo che se a è multiplo di b la distanza di mod(a,b) da 0 (cioè il suo valore) dipenda da a/b stesso, cioè da quanto grande è a rispetto a b.

basta vedere che mod(a,b)=a-b*int(a/b)

:stordita: :stordita: minchia che figura... :stordita: :stordita:
...e io che pensavo che eri un niubbo ignorante come me...:fagiano:
...mi defilo... :ops2:

cionci
12-04-2007, 14:23
in realtà temo che se a è multiplo di b la distanza di mod(a,b) da 0 (cioè il suo valore) dipenda da a/b stesso, cioè da quanto grande è a rispetto a b.
Non credo...anche perché a e b possono avere avuto anche una "vita" completamente diversa ed aver subito varie operazioni con un accumulo di errore anche notevole per una e magari nullo per l'altra...

peter2
12-04-2007, 14:45
Non credo...anche perché a e b possono avere avuto anche una "vita" completamente diversa ed aver subito varie operazioni con un accumulo di errore anche notevole per una e magari nullo per l'altra...

no ho capito che cosa c'entra l'accumulazione dell'errore su a (b) sul fatto che possa essere multiplo o meno di b (a) :fagiano:

in ogni caso non ne sono uscito....
mi date un algoritmo che, dati (a,b) reali, riesca a capire se a è multiplo di b, in qualsiasi precisione si stia lavorando

(a,b)=

(0.0001,0.1) (multiplo)
(0.001,0.1) (multiplo)
(5.,4.) (NON multiplo)
(5.,3.) (NON multiplo)