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

[11] Re: Double e approssimazioni

Messaggioda Foto UtenteRenzoDF » 5 ott 2010, 12:57

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


diversi per 1 parte su 10^15 ? ... per me, ma anche per il JPL quei due valori sono coincidenti :!: :mrgreen:

Ti riposto un video interessante sull'argomento :mrgreen:
http://videosift.com/video/IBM-Powers-O ... ence-video
... una volta che l'avrai visto, vedrai che saranno UGUALI anche per Te :D
"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

[12] Re: Double e approssimazioni

Messaggioda Foto UtenteBerello » 5 ott 2010, 13:51

Luca, sei sicuro che la differenza tra i due risultati sia dovuta a differenze di approssimazione?
Hai detto che parti da numeri diversi sulle due macchine virtuali; la differenza nel risultato non potrebbe essere dovuta a quello?
Prova ad esempio a partire dagli stessi numeri sulle due macchine virtuali e vedi se il risultato che ottieni è ancora diverso. Probabilmente il problema non è in quell'operazione che hai segnalato, ma nelle operazioni precedenti, che generano le coordinate dei punti. Non ne sono sicuro, ma fai una prova e lo scopriremo.

Da quel che ricordo, il double è definito secondo lo standard IEEE754 e la sua precisione è definita dallo standard. Quindi dovrebbe essere la stessa precisione, ovunque questo standard si applicato.
Tant'è vero che un double occupa 64 bit sia su macchine a 32 bit, sia su macchine a 64 bit.

Fammi sapere! :wink:
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[13] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 14:29

RenzoDF ha scritto:diversi per 1 parte su 10^15 ? ... per me, ma anche per il JPL quei due valori sono coincidenti :!: :mrgreen:

Anche per me sono uguali, ma la macchina non la pensa allo stesso modo...

RenzoDF ha scritto:Ti riposto un video interessante sull'argomento :mrgreen:

Purtroppo da qui i video non si vedono, lo guardo stasera!

Berello ha scritto:Tant'è vero che un double occupa 64 bit sia su macchine a 32 bit, sia su macchine a 64 bit.

Infatti suona male anche a me.
Berello ha scritto:Hai detto che parti da numeri diversi sulle due macchine virtuali; la differenza nel risultato non potrebbe essere dovuta a quello?

Se su linux a 64 bit, al posto di usare la jvm a 64 bit uso quella a 32 bit il risultato e` uguale a win.
Quindi, che sia nel punto che ho segnalato io o in un altro punto, purtroppo sempre di una differenza di approssimazione si tratta.
Berello ha scritto:Prova ad esempio a partire dagli stessi numeri sulle due macchine virtuali e vedi se il risultato che ottieni è ancora diverso.

Adesso faccio anche quella prova, ma non sono molto fiducioso...
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

[14] Re: Double e approssimazioni

Messaggioda Foto UtenteRenzoDF » 5 ott 2010, 14:35

posta10100 ha scritto:
RenzoDF ha scritto:diversi per 1 parte su 10^15 ? ... per me, ma anche per il JPL quei due valori sono coincidenti :!: :mrgreen:

Anche per me sono uguali, ma la macchina non la pensa allo stesso modo...


Io continuo a non capire, comunque ...

sta a te "convincerla" :D ... credi che il martello lo abbiano inventato per che scopo ? :mrgreen:
"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

[15] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 15:27

RenzoDF ha scritto:credi che il martello lo abbiano inventato per che scopo ? :mrgreen:

Per darlo in testa a chi so io!
Berello aveva ragione. =D>
La differenza e` dovuta a quella parte su n-mila che differenziava i 2 punti.
Il problema ora e` che ho trovato la causa: le funzioni sin e cos restituiscono risultati diversi a seconda della jvm!
Ecco il codice di test (manca la parte del confronto delle stringhe ma non e` importante).
Codice: Seleziona tutto
   
public void testJVM() throws Exception {
        double angleDelta = Math.PI / 28.0;
        String cosValues = "";
        String sinValues = "";
        for (int i = 0; i < 28 * 2; i++) {
            cosValues += Math.cos(i * angleDelta) + "\n";
            sinValues += Math.sin(i * angleDelta) + "\n";
        }
}

Il valore di cos\left ( \frac{\pi }{28}\cdot 5 \right ) su jvm a 32 bit e` 0.8467241992282841, a 64 bit vale 0.8467241992282842.
Il valore di sin\left ( \frac{\pi }{28}\cdot 3 \right ) su jvm a 32 bit e` 0.3302790619551671, a 64 bit vale 0.33027906195516704.

Vado a cercare un martello piu` grande, quello che ho non basta.
Grazie a tutti!
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

[16] Re: Double e approssimazioni

Messaggioda Foto UtenteBerello » 5 ott 2010, 15:58

Sono andato a cercare sulle API di Java; per Math.sin() e Math.cos() dice: "The computed result must be within 1 ulp of the exact result. Results must be semi-monotonic."
E "ulp" significa "unit of least precision".
Sarà questo il motivo per cui il risultato è diverso su macchine a 32 bit o a 64 bit? Eppure a mio parere non dovrebbe.
A questo punto, potresti ridefinire delle tue funzioni sin() e cos() (magari semplicemente troncando quelle fornite da Java). Sarebbe comunque approssimato, ma così dovresti ottenere lo stesso risultato in 32 e in 64 bit. :mrgreen:

Vedi anche questo!
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[17] Re: Double e approssimazioni

Messaggioda Foto Utentexyz » 5 ott 2010, 16:26

I calcoli in float point nelle architetture Intel differiscono se calcolati con la FPU o con le SSE. Di solito i programmi a 32 bit sono compilati con utilizzo della FPU la quale calcola sempre con una precisione di 80 bit (long long double, estensione proprietaria del IEEE-754) e poi tronca a 64 bit (double) o 32 bit (float) a seconda del dato richiesto. Con l'avvento delle CPU a 64 bit e l'introduzione dei calcoli con il set di istruzioni SSE (se abilitati in fase di compilazione) i numeri float point sono calcolati con una precisione di 64 bit (standard IEEE-754) quindi possono differire di poco rispetto ai calcoli fatti con la FPU.

Il tuo problema di risolve semplicemente imponendo un arrotondamento ad un numero sensato di decimali, ad esempio consideri solo 4 cifre decimali.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[18] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 16:44

Berello ha scritto:A questo punto, potresti ridefinire delle tue funzioni sin() e cos() (magari semplicemente troncando quelle fornite da Java)

Ho fatto giusto questo, ora da lo stesso risultato.
Berello ha scritto:Eppure a mio parere non dovrebbe.

Anche secondo me e` non dovrebbe, anzi non deve. Pazienza l'importante e` che ora funziona.
xyz ha scritto:I calcoli in float point nelle architetture Intel differiscono...

Ecco il motivo!

Grazie, si imparano sempre cose nuove!
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

[19] Re: Double e approssimazioni

Messaggioda Foto UtenteRenzoDF » 5 ott 2010, 17:12

Come ha già sottolineato xyz anch'io il problema non lo vedo proprio, se non come semplice curiosità !

BTW se avessi scritto un risultato con tutte quelle cifre significative (impossibile per il mio regolo :mrgreen: ) il mio Prof. di Elettrotecnica mi avrebbe messo un 2, anche con tutto il compito corretto :wink:

....
Il numero di cifre significative sarebbero invece stato importante, per esempio, per questo calcolo :mrgreen:
http://blog.modernmechanix.com/2009/11/ ... t-numbers/
"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

[20] Re: Double e approssimazioni

Messaggioda Foto Utenteposta10100 » 5 ott 2010, 19:15

Vediamo di spiegare il motivo per cui per me è importante avere lo stesso risultato su tutte le jvm.
Ho implementato dei test (JUnit test) che lanciano una serie di metodi java confrontando poi il risultato con un risultato atteso.

Se supponiamo io stia testando il metodo Math.cos, con il metodo di test che ho postato in [15].
La stringa cosValues alla fine del ciclo contiene tutti i valori restituiti da Math.cos.
Questa stringa la confronto con una nota, se coincidono va tutto bene, se ci sono differenze qualcosa non funziona come dovrebbe.
Se tra una jvm e l'altra il valore di Math.cos cambia, allora anche la stringa cambia e il test fallisce anche se il codice scritto è corretto.
Supponiamo ora che il valore restituito da Math.cos viene utilizzato per ricavare i punti su di una ellisse.
Se tra una jvm e l'altra i valori del coseno cambiano allora anche i punti sull'ellisse saranno leggermente diversi e tutti i metodi di test dell'ellisse falliscono.

Probabilmente vi ho confuso ancora di più le idee, ma questo è il motivo per cui per me è importante avere lo stesso risultato su tutte le jvm.
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

PrecedenteProssimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti