Oppure

Loading
30/05/12 19:00
popp109
Salve ho notato che elaborando questa espressione
double pippo = 1.2+1.5+1.7f-1.5-1.2;


in c++ e python mi restituisce:
1.7

mentre in java :
1.7000000476883716

mntre con
double pippo = 1.2+1.5+1.7f-1.5-1.2*2.2f;


in c++ e python mi restituisce:
0.26

in java :
0.2599999904632573

come mai?
Quale risultato è più corretto?
Se il risultato più corretto è quello di java, come posso ottenere lo stesso risultato in c++?

grazie
aaa
30/05/12 19:58
nessuno
Scusa ... ma come fa, secondo te, ad essere corretto il risultato con tutti quei decimali, se quei decimali non esistono nei valori delle espressioni che hai mostrato?

Hai fatto, con carta e penna, le operazioni in questione? E che risultato hai?

E' ovvio che i risultati corretti sono i primi !

Gli errori di approssimazione derivanti dalla rappresentazione binaria dei valori decimali è inevitabile e avviene con tutti i linguaggi (perché non è questione di linguaggio ma di errori insiti nella rappresentazione del valore).
Probabilmente hai solamente utilizzato una funzione per "visualizzare" i valori che ha "corretto" il valore in uscita. Ma non l'hai fatto per il tuo codice Java.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
30/05/12 21:07
popp109
Postato originariamente da nessuno:

Scusa ... ma come fa, secondo te, ad essere corretto il risultato con tutti quei decimali, se quei decimali non esistono nei valori delle espressioni che hai mostrato?

Hai fatto, con carta e penna, le operazioni in questione? E che risultato hai?

E' ovvio che i risultati corretti sono i primi !

Gli errori di approssimazione derivanti dalla rappresentazione binaria dei valori decimali è inevitabile e avviene con tutti i linguaggi (perché non è questione di linguaggio ma di errori insiti nella rappresentazione del valore).
Probabilmente hai solamente utilizzato una funzione per "visualizzare" i valori che ha "corretto" il valore in uscita. Ma non l'hai fatto per il tuo codice Java.


Ho semplicemente scritto in c++

double pippo = 1.2+1.5+1.7f-1.5-1.2; 
cout << pippo;


e in java

double pippo = 1.2+1.5+1.7f-1.5-1.2; 
System.out.println(pippo);


Comunque accade solo se metto dei valori float con double perche se in java i valori float li casto in double il risultato è corretto.
aaa
31/05/12 0:16
HeDo

è evidente che qui mancano delle basi sulla rappresentazione dei numeri a virgola mobile.

consiglio un'attenta lettura: it.wikipedia.org/wiki/…
aaa
31/05/12 9:23
popp109
Conosco i vari problemi ma a me interessava sapere perchè java rispetto al c++ me li fa notare.Siccome ho realizzato una classe che esegue espressioni scritte in una stringa e il risultato è simile al c++, volevo capire se in java utilizzano qualche algoritmo meno efficiente del c.
Secondo me non hanno utilizzato i tipi base del c ma hanno creato dei tipi da zero, altrimenti non si spiegherebbe quel risultato.A meno che tu non mi dia una conferma che utilizzando lo stesso linguaggio su più computer diversi possa portare a dei risultati diversi(parlo sempre di tutti quei numeri di troppo).

esempio pc casa:
1.7000000476883716

pc lavoro
1.7000000125255655

portatile
1.7

Se così fosse e visto che esistono funzioni che fanno queste correzioni, perchè java lascia a noi il compito d correggere tali sbavature?
aaa
31/05/12 9:47
nessuno
Se, come dici, conosci i problemi, allora non capisco perché fai ancora queste domande.

Non esistono differenze tra i linguaggi (e te lo avevo anche detto), tanto meno differenze di "algoritmi" perché i calcoli sono fatti dal processore matematico (hardware) e non dal linguaggio.

Quindi non avrai alcuna differenza di "calcolo" (o errori di arrotondamento diversi tra sistemi) ma, solamente una "visualizzazione" diversa del valore.

In tutti i casi, non vedo problemi, utilizza SEMPRE i double per la maggiore precisione e lavora tranquillamente.

P.S. Se proprio vuoi dare un'occhiata al problema, digli al C/C++ di farti vedere tutti i decimali

printf("%.16lf\n", pippo);
Ultima modifica effettuata da nessuno 31/05/12 9:52
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
31/05/12 23:57
popp109
printf("%.16lf\n", pippo);
con questo mi hai risposto a tutto.
aaa