Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Double e approssimazioni

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 10:37

Oggi mi sono imbattuto in un problema bello grosso!
Presi due punti (con coordinate di tipo double) ne devo calcolare la distanza.
La formula utilizzata e`:
Codice: Seleziona tutto
(px * px + py * py)

Fin qui tutto bene ma facendolo girare non ottengo risultato sperato!

L'ambiente di sviluppo e` java, le virtual machine su cui lavoro sono win a 32 bit e linux a 64 bit.
Se i punti sono:
P1 = (-90.09688679024191,-21.694186955877907)
P2 = (-84.67241992282841,-26.60160382576683)
(in realta` su linux il punto e` P2 = (-84.67241992282842,-26.60160382576683)
su win ottengo 53.507581130537226,
mentre su linux 53.507581130537076.

Il problema e` che quella piccola differenza porta poi a risultati diametralmente opposti!
Qualche consiglio su come ovviare al problema?
Arrotondare o troncare il numero non risolve il problema, le approssimazioni colpiscono anche li!

Grazie,
Luca
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[2] Re: Double e approssimazioni

Messaggioda Foto Utenteangus » 5 ott 2010, 11:20

C'è un motivo per cui non puoi usare BigDecimal al posto di double?
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25

0
voti

[3] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 11:31

Dovrei metter mano a circa 2000 classi! :roll:
Potrei pensarci per la prossima versione ma dal punto di vista delle prestazioni come si comporta?
Voglio dire, se ripeto l'operazione qualche milione di volte, la differenza si nota oppure e` trascurabile?

Se ci fosse un'alternativa sarei molto piu` contento!

Grazie ancora!
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[4] Re: Double e approssimazioni

Messaggioda Foto UtenteRenzoDF » 5 ott 2010, 11:40

Io non ho capito nulla :mrgreen: , potresti ri-spiegarmi il problema, "la distanza" e il "diametralmente opposto" ? :roll:
"Il circuito ha sempre ragione" (Luigi Malesani)
Avatar utente
Foto UtenteRenzoDF
55,9k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 13189
Iscritto il: 4 ott 2008, 9:55

0
voti

[5] Re: Double e approssimazioni

Messaggioda Foto Utenteangus » 5 ott 2010, 11:50

posta10100 ha scritto:dal punto di vista delle prestazioni come si comporta?

molto più lento, ovviamente
posta10100 ha scritto:...se ripeto l'operazione qualche milione di volte...
Se ci fosse un'alternativa sarei molto piu` contento!

Se il problema sono le prestazioni, perché usare Java? :mrgreen:
flame a parte, hai provato con distanceSq() della class Point2D (java.awt.geom.Point2D) che fa già quello che vuoi fare? (e in effetti lavora in double)
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25

0
voti

[6] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 11:57

RenzoDF ha scritto:Io non ho capito nulla :mrgreen: ,

Nemmeno io! :lol:

Il mio ragionamento era contorto lo so!

In pratica il calcolo della distanza tra due punti (in realta` il quadrato della distanza) restituisce 2 risultati leggermente diversi se fatta girare su win a 32 bit (ma fa lo stesso su linux con jvm a 32 bit) e linux a 64 bit.
Questa differenza porta poi, dopo una serie di operazioni, ad un risultato completamente diverso.

Purtroppo non posso utilizzare la jvm a 32 bit su linux perche` si appoggia su alcune librerie esterne disponibili solo a 64 bit.

Sto cercando di capire se si puo` far lavorare la jvm a 64 bit come se fosse una 32 bit ma ancora non ho trovato niente in proposito.
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[7] Re: Double e approssimazioni

Messaggioda Foto Utenteangus » 5 ott 2010, 12:05

domanda: ma quello che ti "rompe" è l'approssimazione o il fatto che sia diversa a 32 e 64 bit?
perché gira e rigira a quella non scappi...
ti lascio questo link http://blogs.sun.com/CoreJavaTechTips/entry/the_need_for_bigdecimal

ciao
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25

0
voti

[8] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 12:19

L'approssimazione non e` un problema, quello che non va e` che a 32 bit e a 64 bit ho valori diversi.

Do un occhio al link, intanto sto cercando di capire come funziona groovy, sembra permettere l'overloading degli operatori, in questo modo sarebbe piu` semplice usare BigInteger!
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[9] Re: Double e approssimazioni

Messaggioda Foto UtenteDirtyDeeds » 5 ott 2010, 12:48

posta10100 ha scritto:In pratica il calcolo della distanza tra due punti (in realta` il quadrato della distanza) restituisce 2 risultati leggermente diversi se fatta girare su win a 32 bit (ma fa lo stesso su linux con jvm a 32 bit) e linux a 64 bit.
Questa differenza porta poi, dopo una serie di operazioni, ad un risultato completamente diverso.


Come RenzoDF anch'io non ho capito nulla: nella stragrande maggioranza dei problemi, se una differenza così porta ad un risultato completamente diverso, è perché i calcoli successivi sono impostati male, molto male. Quando si fa un programma bisognerebbe tenere conto che l'aritmetica usata dai calcolatori è finita, e impostare i conti in modo tale che certe approssimazioni non si propaghino in modo "esplosivo".

Senza i dettagli di ciò che fai dopo, però, è un po' difficile aiutarti.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[10] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 12:52

Il metodo restituisce il segmento piu` lungo tra quelli presenti in una polyline.
Quella piccola differenza fa si che venga scelto un segmento piuttosto che un altro.
Come vedi una differenza cosi` piccola puo` diventare importante!
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti