|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2000
Città: Roma
Messaggi: 1612
|
[generico] multiplo
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 ) 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?
__________________
peter |
![]() |
![]() |
![]() |
#2 |
Junior Member
Iscritto dal: Aug 2006
Città: Pescara
Messaggi: 62
|
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.
__________________
"I giganti sembrano tali solo a coloro che vivono in ginocchio.."
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2000
Città: Roma
Messaggi: 1612
|
Quote:
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)
__________________
peter |
|
![]() |
![]() |
![]() |
#5 | |
Junior Member
Iscritto dal: Aug 2006
Città: Pescara
Messaggi: 62
|
Quote:
![]() ![]() ![]() ![]() ...e io che pensavo che eri un niubbo ignorante come me... ![]() ...mi defilo... ![]()
__________________
"I giganti sembrano tali solo a coloro che vivono in ginocchio.."
Ultima modifica di Psylo : 12-04-2007 alle 13:03. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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...
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2000
Città: Roma
Messaggi: 1612
|
Quote:
![]() 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)
__________________
peter |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:10.