Newsgroup: it.comp.lang.visual-basic
Titolo: Arrotondamenti ?

Nella finestra "immediata":
? 7007.9 + 0.2 = 7008.1
Falso
? 7007.9 + 0.3 = 7008.2
Vero
Credo sia gią stato affrontato in passato... qualcuno mi rinfresca il perchč
di questo comportamento ?

 di questo comportamento ?
? 7007.9@ + 0.2@ = 7008.1@
Vero
Alberto
-- 
La bellezza è opinabile, sulla bruttezza sono tutti d'accordo.

 Vero
Ok, ma qual è il motivo per cui due numeri entrambi con una cifra decimale
sommati A VOLTE danno un valore con un "resto" ?

 sommati A VOLTE danno un valore con un "resto" ?
Allora non ti sei accorto del 'tipo' che ho usato...
Il tuo codice utilizza implicitamente un virgola mobile.
Il che fa perdere la congruenza con la rappresentazione decimale (che è 
quella umana).
In sostanza, tu CREDI di usare un numero con una virgola decimale. In 
realtà stai dicendo a VB di usare un virgola mobile, ossia un numero 
che si rappresenta in mantissa/esponente, e che immagino nessuno di noi 
sia in grado di visualizzare mentalmente. Da cui, nessuna 
considerazione come le tue è affidabile.
Ciao
Alberto
-- 
Chi semina raccoglie,
ma chi raccoglie si china.
E a quel punto è un attimo...

 considerazione come le tue è affidabile.
Qui sei andato sul difficile.
Io mi limito a dire che (a questo punto nel mio immaginario) mi aspetto che
un numero in virgola mobile (7007.9) sia identico a
7007.9000000000000000000000..... (con una serie infinita di zeri) così come
0.2 sia identico a 0.200000000000000 (come sopra..).
Evidentemente non è così, ma la cosa non è che sia così naturale. Le
calcolatrici lavorano anch'esse in virgola mobile, ma vivaddio 7007.9 + 0.2
fa sempre 7008.1
E poi perchè allora 7007.9 + 0.3 = 7008.2  da vero ? Dovrebbe esserci lo
stesso problema.
Perdona l'ignoranza, e grazie per la spiegazione.

> nessuna considerazione come le tue è affidabile"
Non ho detto che il risultato sia sempre sbagliato. Ho detto che 
ragionando in un mondo matematico diverso da quello decimale, non puoi 
fare considerazioni decimali.
Ad esempio, il tuo
7007.9 + 0.3 = 7008.2
potrebbe essere
7007.900000000000000000000001 + 0.300000000000000000000001 = 
7008.200000000000000000000001
che è appunto vero.
Ribadisco che le rappresentazioni qui fatte sono comunque delle 
astrazioni e delle approssimazioni, rappresentare in decimale un 
virgola mobile è un po' come dipingere Dio. Nessun umano sa com'è.
Alberto
-- 
Alessandro Bergonzoni: Il tempo vola e noi no. Strano sarebbe se noi 
volassimo e il tempo no, il cielo sarebbe pieno di uomini con 
l'orologio fermo.

 virgola mobile č un po' come dipingere Dio. Nessun umano sa com'č.
Ho un'altra domanda: i double sono numeri in virgola mobile, giusto ? Se č
cosě, significa che dati a, b e c definiti "as Double", ponendo a = 7007.9
b = 0.2  c = 7008.1, avremo che  a + b = c   č falso.
Quindi come se ne esce ? Sempre con il Currency ?

 Quindi come se ne esce ? Sempre con il Currency ?
O utilizzi un tipo di dato in virgola fissa, come Currency o Decimal
(in VB6 un sottotipo del variant), oppure se proprio devi lavorare in
virgola mobile, quando vuoi applicare il concetto di uguaglianza, devi
scegliere qual'è la tua tolleranza minima, e basarti su quella.
Per esempio con una funzione tipo questa:
Function AlmostEqual(ByVal a As Double, ByVal b As Double, ByVal
tolerance As Double) As Boolean
      If Abs(a - b) < tolerance Then
         AlmostEqual = True
      Else
         AlmostEqual = False
      End If
End Function
e quindi
a = 7007.9
b = 0.2
c = 7008.1
Debug.Print(AlmostEqual(a + b), c, 0.000001) ' True

 Quindi come se ne esce ? Sempre con il Currency ?
Non 'sempre'.
Ogni tipo ha il suo utilizzo.
I virgola mobile servono per rappresentare numeri immensamente piccoli 
o immensamente grandi, ossia quei numeri non rappresentabili coi 
virgola fissa. Tipicamente, le grandezze scientifiche o i passaggi 
intermedi di calcoli che richiedano estrema precisione.
I virgola fissa servono per rappresentare ciò che vogliamo congruente 
col pensiero umano, tipicamente importi e quantità.
Quindi, se i tuoi 7007.9, 0.2, 7008.1, sono ad esempio importi, direi 
che il Currency è un tipo molto adatto a rappresentarli.
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore

 un concetto binario, ti ritorna falso.
Ecco, questo concetto dell'incertezza legato alla matematica, che dovrebbe
essere una scienza esatta mi risulta poco chiaro (mi viene in mente al
scenetta del finlm "Non ci resta che piangere", in cui Benigni e Troisi al
cospetto di Leonardo Da Vinci si chiedono ".. ma 2 + 2 farà quattro ?"),
probabilmente per i motivi che hai spiegato in precedenza legati al nostro
modo di ragionare in decimale.
Approfitto per ringraziarvi per i chiarimenti e per la pazienza :-)

essere una scienza esatta mi risulta poco chiaro
I computer non usano il sistema decimale per fare calcoli ma quello binario, e
in caso di numeri a virgola mobile debbono fare dalle approssimazioni che
portano a situazioni come quella che hai descritto..
--
ciao
  Stefano

 modo di ragionare in decimale.
La matematica è una scienza esatta. Almeno nei modelli che noi umani 
abbiamo creato per rappresentare la matematica.
Ma abbiamo creato diversi modelli. Compatibili, ma diversi.
Pensa solo ai numeri immaginari...
Che un modello ti sembri incongruente con un altro è solo una 
limitazione delle conoscenze e delle capacità elaborative (nel senso 
che 'teoricamente' uno potrebbe anche ragionare in virgola mobile, ma 
non sarebbe pratico).
Alberto
-- 
Thomas Fuller: Ci sono persone che sono state considerate coraggiose 
perchè avevano troppa paura per scappare.