Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Risultato diverso c++ Java python
Forum - C/C++ - Risultato diverso c++ Java python

Avatar
popp109 (Normal User)
Rookie


Messaggi: 27
Iscritto: 27/11/2010

Segnala al moderatore
Postato alle 21:00
Mercoledì, 30/05/2012
Salve ho notato che elaborando questa espressione
Codice sorgente - presumibilmente C/C++

  1. 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  
Codice sorgente - presumibilmente C/C++

  1. 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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:58
Mercoledì, 30/05/2012
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à.
PM Quote
Avatar
popp109 (Normal User)
Rookie


Messaggi: 27
Iscritto: 27/11/2010

Segnala al moderatore
Postato alle 23:07
Mercoledì, 30/05/2012
Testo quotato

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++

Codice sorgente - presumibilmente C/C++

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



e in java

Codice sorgente - presumibilmente C/C++

  1. double pippo = 1.2+1.5+1.7f-1.5-1.2;
  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.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 2:16
Giovedì, 31/05/2012

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

consiglio un'attenta lettura: http://it.wikipedia.org/wiki/Numero_in_virgola_mobile

PM Quote
Avatar
popp109 (Normal User)
Rookie


Messaggi: 27
Iscritto: 27/11/2010

Segnala al moderatore
Postato alle 11:23
Giovedì, 31/05/2012
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?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:47
Giovedì, 31/05/2012
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 il 31/05/2012 alle 11: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à.
PM Quote
Avatar
popp109 (Normal User)
Rookie


Messaggi: 27
Iscritto: 27/11/2010

Segnala al moderatore
Postato alle 1:57
Venerdì, 01/06/2012
printf("%.16lf\n", pippo);
con questo mi hai risposto a tutto.

PM Quote