Newsgroup: it.comp.lang.visual-basic
Titolo: Double e calcoli strani. Ok, ma io non lo accetto.

    Dim c1 As Double
    Dim c2 As Double
    Dim c3 As Double
    Dim c4 As Double
    c1 = 221.11
    c2 = 184.26
    c3 = 36.85
    c4 = c1 - (c2 + c3)
    MsgBox c4
Va bene, ho seguito la storia dei binari, decimali e virgola mobile.
La mia idea resta sempre quella, nel terzo millennio: NON E' CONCEPIBILE!
Lo è ancor meno se l'ultima riga, grazie alla mia rottura di maroni, diventa
MsgBox Round(c4, 10)
Ohhhh, non ho scritto 2, ma 10!
Loro, 'sti sfaticati, loro dovevano farlo, non io, e non, soprattutto, dopo
che un utente mi dice "il tuo programma sbaglia a fare i conti".
Mavaffancullo Bill, vaffanculo Microsoft (bello in chiaro) e vaffanculo pure
l'ANSI se c'entra qualcosa. Tornate a scuola a far di conto, asini!
La mia astinenza da fumo non mi giustifica, l'avrei detto/scritto prima, lo
dirò/scriverò sempre.

 Ohhhh, non ho scritto 2, ma 10!
qui non ho capito cosa intendi dire
ciaociao

     MsgBox c4
mi sembra 2 virgola qualcosa per 10 elevato alla -14
a conti fatti, non č poi cosě diverso dallo 0 :-)
comunque, e lo sai, la colpa non č di microsoft, nč dell'ansi, nč di chi ha
fissato questa regola (I e uno sproposito di E)
comunque tutto si sitema utilizzando i currency (e sai anche questo).
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 qui non ho capito cosa intendi dire
Intendo dire che tutto si poteva risolvere alla fonte, invece devo farlo io,
tu, noi.

 qui non ho capito cosa intendi dire
Figurati io...
Alberto

 comunque tutto si sitema utilizzando i currency (e sai anche questo).
Con 4 decimali. Pochi!
PS: Scommettiamo che un Currency non è altro che un Double con un Round a 4?
Scommettiamo!
Ho la rabbia di un Vesuvio che s'è fatto qualche cisterna di lassativo.

 Alberto
ciaociao

 Ohhhh, non ho scritto 2, ma 10!
[SNIP]
Qui non ho capito esattamente cosa vuoi dire... ci sono in tutto 13 zeri
dopo la virgola, qualsiasi round con parametro <=13 ti restituira',
correttamente, zero
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


questo era chiaro, intendo dire che non ho capito il "Ohhhh, non ho scritto
2, ma 10!"

 scritto 2, ma 10!"
Non ho bisogno di arrotondare al decimale presumibilmente atteso o lě
vicino, basta un arrotondamento qualsiasi, anche 10, appunto

 ammessi).
no. per errore, ho corretto il tuo codice con round(c4,20). c4 resta quel
famoso 2 e sbisliga


 restituira', correttamente, zero
A maggior ragione!
Voglio dire che bastava introdurre un arrotondamento..
Lo devo fare io. Lo faccio e m'incazzo.
M'incazzo e dico, a tutto il mondo informatico, "NON E' CONCEPIBILE!"

 Ho la rabbia di un Vesuvio che s'è fatto qualche cisterna di lassativo.
Maddài...
ci sono in giro classi di numeri ad alta precisione (e lentezza). Oracle
stesso ne fornisce una, piuttosto macchinosa da usare.
<x:termoPilucco>

Avrebbe potuto.
E qui c'e' la buona notizia: il Decimal :-)
-- 
ciao, hal

 Perchè bastava ... lavorare.
E qui secondo me e' l'equivoco di fondo: nella mia beata ignoranza di
calcolatrici la vedo diversamente; per quanto ne so il modello da 2 euro usa
algoritmi di calcolo in virgola mobile, poi pero' *chi ha progettato la
calcolatrice*, visto e considerato il target a cui si rivolge, ha deciso di
imporre un arrotondamento arbitrario.
Allo stesso modo, sei tu programmatore che conosci il tipo di operazione che
stai facendo e sei tu che stabilisci quale rappresentazione e quale
precisione devono avere i calcoli per il contesto in cui sei, ergo sei tu
che devi "lavorare"; il linguaggio (qualsiasi) invece non sa nulla di tutto
questo, se qualcuno gli dice di usare un tipo di dato in virgola mobile *non
si deve nemmeno azzardare* a fare arrotondamenti a casaccio
Il motivo mi sembra anche banale: se a te servono, per dire, solo 5
decimali, fai sempre a tempo ad arrotondare dopo, ma se a Tizio servivano
tutti e 14 i decimali del tuo esempio (p.s. Prova Round(c4, 14) e vedi che
il tuo arrotondamento a zero non e' casuale) come li recupera se il
compilatore glieli ha cancellati da sotto il culo?


 Ohhhh, non ho scritto 2, ma 10!
Si riferiva al fatto che ci sono 10 tipi di persone al mondo: quelle che
capiscono i numeri binari e quelli che non lo capiscono. Probabilmente Lupo
pensava che le persone che frequentano questo ng non siano del 10° tipo,
scusate intendevo dire del 2°...
ps (avete mai visto "incontri ravvicinati del 11° tipo"? e che ne dite di
"111 spose per 111 fratelli"?)
...mitico questa operazione da tre risultati diversi. 0 per i comuni
mortali, 2E-14 con i double e 7E-6 con i single. ma allora 2+2 farà ancora
4? meglio kiedere alla microsoft


 E qui c'e' la buona notizia: il Decimal :-)
Comodo da implementare... un varaint con un cast! ;-)

"hal1961"  ha scritto:

Alludi a System.Decimal di .Net?
E' virgola mobile a 128 Bit.
Vediamo un po' la definizione di M$
Range: ±1,0x10^-28 a ±7,9x10^28
Il che significa circa 56 cifre decimali.
Tolgo un bit per il segno e ottengo127/56=2,26 bit per ogni cifra decimale.
Per avere la precisione assoluta ne servono 1/log(2)=3.32
Da ciò si deduce che qualche buco c'è, ma sicuramente la situazione migliora
notevolmente.
<x:termoPilucco>

 
Prova cosě:
'*** in una nuova classe che chiameray MyDecimal
Option Explicit
Dim p_Dec As Variant
Public Property Get Value() As Variant
     Value = CDec(p_Dec)
End Property
Public Property Let Value(V As Variant)
     p_Dec = CDec(V)
End Property
 
'*** fine della classe
Private Sub Command1_Click()
     Dim c1 As New MyDecimal
     Dim c2 As New MyDecimal
     Dim c3 As New MyDecimal
     Dim c4 As New MyDecimal
     c1.Value = 221.11
     c2.Value = 184.26
     c3.Value = 36.85
     c4.Value = c1.Value - (c2.Value + c3.Value)
     MsgBox c4.Value
End Sub
Il decimal č un currency piů potente, solo che hanno pensato bene
d'implementarlo solo come sottotipo del variant :)
ciao

 d'implementarlo solo come sottotipo del variant :)
In VB6 si... sara' la volta che Lupo valutera' il passaggio a (eresia!)
.NET? ;-)


 La mia astinenza da fumo non mi giustifica, l'avrei detto/scritto prima,
lo
la prossima volta, se debuggi bene il tuo codice, vedrai che certi problemi
li trovi prima che il tuo cliente ti dica "il tuo programma non fa bene i
conti", giusto?
non ci credo molto, però, vabbè......good coding!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 '*** fine della classe
Uh, non sapevo di CDec in VB6.
Da un breve test mi pare che supporti 15 cifre indipendemente dalla
posizione della virgola.
Non male per la maggior parte delle applicazioni
<x:termoPilucco>

 sarebbe stato giusto.
Direi che la questione č centrata.
Se accetti un numero massimo di decimali relativamente basso (per
determinate applicazioni), non hai il problema di cui ti lamenti.
Ma se ti serve una precisione superiore, deve esistere, in mezzo ai tipi di
variabile, un tipo che ti consenta questa precisione.
Tale tipo si chiama Double.
Se ti incuriosisce, prova a fare calcoli di attualizzazione o
capitalizzazione, quindi con interessi che si compongono, usando tipi con
'notazione decimale'.
Il risultato che ottieni, moltiplicato per numeri superiori a quanto io e te
guadagniamo, darebbe errori molto piů pesanti di quelli ottenibili usando il
double.
Tutto qui.
Quello di cui ci si deve lamentare, e a ragione, č che il Currency abbia
pochi decimali. O, meglio, che non esista una sorta di LongCurrency, da
usare al posto del double quando si voglia ottenere il tuo tipo di scopo.
Ciao
Alberto

 Ciao
ciaociao

 usare al posto del double quando si voglia ottenere il tuo tipo di scopo.
Non proprio.
Il LongCurrency è proprio il decimal: un intero scalato con un buon 
numero di posizioni decimali.
Dall'help:
A data type that contains decimal numbers scaled by a power of 10. For 
zero-scaled numbers, that is, numbers with no decimal places, the range 
is +/-79,228,162,514,264,337,593,543,950,335. For numbers with 28 
decimal places the range is +/-7.9228162514264337593543950335. The 
smallest non-zero number that can be represented as a Decimal is 
0.0000000000000000000000000001.
A me pare sufficientemente capiente.
Probabilmente essendo in realtà un intero è un po' più lento nelle 
divisioni.
Ciao

 numero di posizioni decimali.
Ho imparato una cosa nuova.
Note   At this time the Decimal data type can only be used within a Variant,
that is, you cannot declare a variable to be of type Decimal. You can,
however, create a Variant whose subtype is Decimal using the CDec function.
Prendo la tua classina e me la salvo.
Ciao
Alberto

 End Sub
ne approfitto per chiedere una cosa:
esiste la possibilità di definire la property di default per una classe?
In modo da non dover specificare, ad esempio, c4.Value ma solo c4?
ciaociao

Marg wrote:

Sì, volevo dirlo, così il codice a parte il New iniziale è identico a 
quello originale.
Devi andare nel menu strumenti-attributi routine e definire Value come 
"predefinita nell'interfaccia utente".
Questa pratica non è molto "pulita", e credo sia un po' più lento 
l'accesso a una proprietà non esplicita, però in alcuni (rari) casi può 
essere comoda.
Ciao


Si, anche se nel "nuovo mondo" non sara' piu' supportata alla stessa
maniera.
Comunque, in VB6, apri la classe nell'editor, vai su Strumenti\Attributi
routine scegli dal combo la property che ti interessa, premi Opzioni e
quindi seleziona come 'Id routine' la voce '(predefinita)'
Questo, per la cronaca, nel codice sorgente si traduce in questa riga
Attribute Item.VB_UserMemId = 0
posta subito sotto la dichiarazione della routine Property, ma che viene
nascosta dall'IDE; occhio quindi se modifichi la classe a manina...


 ci sono in giro classi di numeri ad alta precisione (e lentezza).
VB, in memoria?

 nascosta dall'IDE;
Per fortuna nel "nuovo mondo" l'attributo relativo è visibile :)
Ciao

 CONCEPIBILE!
Been there, done that.
E' concepibilissimo, invece: primo, hai una precisione che e' quella che e',
secondo quando l'IEEE ha codificato i tipi a vigola mobile ha deciso di
risparmiare un bit, e questo ha creato tutta una serie di casini.
La soluzione migliore e' farsi i conti in double e convertire in single prima
di sputare il dato: con il demote a single, la precisione esistente viene
troncata, e gli algoritmi di arrotondamento (che non ci crederai ma *ci sono*,
e funzoinano pure) provvedono a sistemare la questione come si deve.
Ciaotutti,
* -- i miei 0.01999999999998 cent :PP

 che capiscono i numeri binari e quelli che non lo capiscono.
No, mi riferivo a un numero di decimali alto.
Io posso persino contare in binario, ma, anche se capisco i binari, non
concepisco che 1-1 non faccia 0!

 (eresia!) .NET? ;-)
No, io amo i Variant.

 non credi?
Sě, ma che la piů grande azienda del mondo non sappia fare 2 stupidi conti č
assurdo e nulla c'entra con la netiquette.
Fermati/fermatevi! Non me strabatte una beata fava di virgole fisse, mobili
o spiritelli!
1-1 deve fare 0 e 221.11-(184.26+36.85) deve fare 0. Non esistono scuse.
Ci sono dei problemi? Non sono certo io che deve pensarci, ma loro.
La calcolatrice con hardware dedicato? Bene, perchč VB non ha un software
"dedicato"?
Ma stiamo scherzando per davvero?!
Mi si puň raccontare tutta la storia geologica del silicio, dei diodi, dei
processori, dei binari, trinari, e millenari, virgole sopra e sotto. Non me
ne puň fregar di meno! I conti devono essere giusti. Non esiste la benchč
minima giustificazione, tantomeno tecnica, perchč se tecnica fosse, tu (Bill
e tutti iproduttori del mondo) che tecnico vuoi apparire, risolvi
tecnicamente il problema, non io!
Con questo ho risposto anche al resto.

 Soglia? E chi la conosce?
Chi scrive il programma
Hai detto che il currency non va bene perche' 4 decimali sono pochi, quindi
sai anche quanti decimali ti servono: quella e' la tua soglia.
Supponendo che tu voglia al massimo 6 cifre decimali, per confrontare due
valori double puoi fare una funzione con
If Abs(Val1 - Val2) < 1 / 10 ^ (6+1) then
    SonoUguali = True
Else
    SonoUguali = False
End if


 
Consiglio la lettura del seguente capitolo:
http://www.library.cornell.edu/nr/bookcpdf/c1-3.pdf
I numeri in virgola mobile non sono numeri Reali e quindi bisogna 
prendere delle precauzioni quando si tratta con loro ...
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 provvedono a sistemare la questione come si deve.
Appunto, porcapupattola! Non concepisco che debba farlo io, nè concepisco
che non lo possano fare loro, pur senza rubarmi alcun decimale di cui avrò
eventualmente bisogno.
Dimostrazione, non è un scherzo:
    Dim c1 As Double
    Dim c2 As Double
    Dim c3 As Double
    Dim c4 As Double
    c1 = 22111
    c2 = 18426
    c3 = 3685
    c4 = c1 - (c2 + c3)
    MsgBox c4
Possibile che non si possa fare qualcosa in modo da aggirare il problema?
Ma sarò proprio scemo?!

 prendere delle precauzioni quando si tratta con loro ...
Io? Io devo prendere le precauzioni?
Uso quel che mi si dà e se non va dico che non va.
Punto.

 
Perche' non provi ad inventare un tipo di variabile che contenga il 
valore "vero" di pigreco e sia di 32 bit o 64 bit o quanti bit ti pare?
I calcolatori utilizzano la virgola mobile perche' non e' possibile fare 
altrimenti. Sei tu che devi adattarti ed adattare i tuoi programmi a 
questo fatto.
Il "problema" che hai evidenziato non riguarda solo MS, ma tutti i 
computer che utilizzano la virgola mobile, cioe' tutti i computer, 
perche' non credo esistano molti calcolatori che utilizzano interi per 
fare calcoli con numeri non interi...


 pare?
O a scriverlo su un foglio a quadretti, di dimensioni finite...


 fare calcoli con numeri non interi...
La calcoltrice da 2 euro. Insisto.
Si può fare, non m'interessa come, ma se si può fare io dico che si deve
fare.
Non lo si fa? M'incazzerò sempre.

 
Devi prendere le precauzioni dell'articolo che ti ho postato. Se pero' 
le precauzioni non vuoi prenderle ...
La letteratura sui calcoli in virgola mobile e' piuttosto ampia.
In tutti i libri di calcolo numerico nel primo capitolo si parla 
dell'errore intrinseco dei numeri in virgola mobile.
Se vuoi continuare ad usare i double devi adattarti tu alla loro logica 
e non il contrario.
Devi anche ammettere che, poiche' ci sono milioni di programmatori che 
coi double riescono a conviverci, e' abbastanza assurdo pensare di 
cambiare tutto per fare contento te. Oltre al fatto non trascurabile che 
cambiare tutto non cambierebbe niente!


 scuse.
Lupo, ti sfugge una cosa.
La trasformazione da espressione decimale a espressione decimale in virgola
mobile implica una approssimazione.
E, fin qua, niente e nessuno può evitarlo.
Se vuoi immagazzinare un valore decimale in un Variant/Decimal (come
giustamente suggerisce Zanna), ottieni una approssimazione legata al numero
di decimali massimo, quindi, diciamo così, 'lineare' con l'umano pensiero.
Se vuoi immagazzinare un valore decimale in un Double, ossia in un virgola
mobile, ottieni una approssimazione non lineare, ossia che varia a seconda
del valore da approssimare, ma che in ogni caso consente di minimizzare
l'approssimazione introdotta. In un caso dovrà approssimare
+0.00000000000000000000001, in un altro caso invece
userà -0.00000000000000000000001
Se due valori vengono arrotondati in modo diverso, la loro differenza non
sarà zero.
Bene, questo ti era chiaro.
Vediamo invece cosa accade dopo.
Se tu utilizzi il Variant/Decimal, hai un tipo di variabile che, continuando
ad addentrarsi nella precisione, inizia a 'cedere' e a presentare errori
molto maggiori rispetto a quanto farebbe un double.
Prendi un tasso di interesse tipo 3.1234%.
Adesso componilo per un certo numero di anni, ossia
1.031234*1.031234*1.031234*1.031234*1.031234*1.031234
La precisione richiesta aumenta ad ogni moltiplicazione.
Se usi, per questa cosa, un Double, o se invece usi un Variant/Decimal,
ottieni valori molto diversi (la differenza è molto in fondo nella scala dei
decimali, ma per determinati importi la differenza c'è).
E, guarda un po', il valore più corretto è quello ottenuto usando i double.
Poi, chissà, magari si poteva fare del microcodice che prendesse i Decimal e
restituisse, se lo si riteneva necessario, un Double. Ma a questo punto
andiamo a discutere anche con Intel o Amd, i quali ci farebbero notare che
esistono degli standard e che occorre rispettarli.
Però la tua ostinazione ha portato un interessante risultato: non sapevo
esistessero i Decimal, seppure come sottotipo del Variant. Chissà che non mi
torni utile...
Ciao
Alberto

 La calcoltrice da 2 euro. Insisto.
La calcolatrice da due euri, se ripeti la moltiplicazione (sai la storiella
di premere due volte l'operatore e fare apparire la k, poi premi '=' tante
volte...), ti dà un valore assolutamente sballato, perchè anzichè i Double
utilizza i Decimal.
Ciao
Alberto

VB, in memoria?
A parte l'esempio che ha citato Zanna, e la classe dei decimali di Oracle (che
però è un ActiveX e, suppongo, anche difficile da distribuire) avevo trovato una
libreria per il C (non so se utilizzabile in VB) dalla precisione virtualmente
infinita (chissà come calcola 1/3  <:)  ).
Un tempo mi ero messo anch'io a scrivere una classe basata sugli array: mi sono
fermato alla divsione :)
Penso che, cercando, qualcosa di buono venga fuori.
<x:termoPilucco>

 
La calcolatrice da 2 euro fa un'approssimazione che va bene per chi 
utilizza una calcolatrice da 2 euro.
Altri hanno bisogno di approssimazioni diverse.
E' il contesto che suggerisce quale approssimazione utilizzare.
Ed e' meglio che sia tu ad avere il controllo sull'approssimazione 
piuttosto che Bill.
Non ti arrabbiare, ma prova a trovare un algoritmo giusto per la tua 
applicazione. Vedrai che ne avrai delle soddisfazioni.


 
http://www.isthe.com/chongo/tech/comp/calc/


 Con questo ho risposto anche al resto.
quoto tutto, perchè tanto non c'entra nulla.
Lupo, se ognuno qua cominciasse a postare tutto quello che non gli va di VB,
non finiremmo, più ti pare?
Uno volta io ho fatto:
For i = 0 to NomeCollezione.Count - 1
    If NomeCollezione(i).Importo>0 Then
        NomeCollezione.Remove i
    End If
Next
dopo un po' mi è andato in errore, perchè il ciclo For viene inizializzato
solo all'inizio. Io dentro il ciclo spazzo via elementi della collection, e
la .Count sembra non risentirne......TI SEMBRA GIUSTO, dico io?!?!?!
questo solo per dire che a me non va 'sta cosa.
Ognuno di noi avrà trovato qualcosa che non gli quadra, però se lo capisce,
lo accetta e la prossima volta è a posto.....
indipendentemente da quello che puoi pensare, il problema che hai trovato è
logico, molto probabilmente descritto a sufficienza su msdn, google e magari
se ne è anche parlato......
mi dà fastidio veramente che tu, per il semplice fatto che credi in quello
che dici, ti senti il diritto di dire:
ok, ho letto, ma tanto VOGLIO avere ragione io: se è così, è così.
punto lo dico io, non tu!
a volte, quasi, riesci a farmi innvervosire, veramente.....
friend forever, good coding!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 applicazione. Vedrai che ne avrai delle soddisfazioni.
Max, quando ho testato il passaggio all'euro, quindi l'introduzione dei
decimali, ho passato tutta la contabilità (il magazzino andava già con
decimali) e ho inserito ottimizzazioni, arrotondamenti e persino, dove
potevo, dei currency. Evidentemente ne ho lasciate fuori alcune. Ogni tanto
salta fuori qualche istruzione che spara fuori merdaccia se i numeri
coinvolti sono di determinate combinazioni, quindi in modo apparentemente
casuale. Quando salta fuori e l'utente sa darmi i numeri esatti io riesco a
riprodurlo, viceversa no.
Resto della mia e non ripasserò a tappeto tutta la procedura. Aspetto la
prossima strana combinazione e m'incazzerò anche allora. E anche allora,
ostinatamente, dirò che si poteva fare di più e meglio.
PS: Perchè la calcolatrice di Win funziona con i miei numeri? E se funziona
perchè lo stesso eventuale algoritmo non è stato applicato a VB per numeri
di quell'entità e/o trattamento? Certo, il programmatore ha adottato degli
accorgimenti. Quindi esistono degli accorgimenti adottabili, dico bene?
Perchè non sono adottati a monte anche in VB? Perchè mai dovrebbe adottarli
a valle il programmatore della calcolatrice di windows o io?
Allora esiste davvero sulla terra e nell'universo un luogo dove sia illecito
mandare Bill?

 E, fin qua, niente e nessuno puň evitarlo.
Non mi sfugge, non lo accetto. E' diverso.
Se un'automobile č destinata ad andare nel fosso, non si costruisce
quell'automobile.
Sto mettendo in discussione tutta l'informatica o, piů precisamente, tutto
il mondo del calcolo numerico?
Parrebbe di sě, invece no!
Io dico che se una persona al mondo riesce a porvi rimedio (sia per fare una
calcolatrice da 2 euro) sia per far scendere una navetta su Marte, allora
tutti coloro che fanno strumenti che presumono il calcolo numerico, devono
porvi rimedio, fin dalla calcolatrice da 2 euro. Se non lo fanno č perchč
non vogliono, non perchč non possono.
Gli standard? Se sono sbagliati che vadano al rogo e se ne facciano altri.
Davvero non capisco come non si possa pretendere (magari lavorando
internamente con interi) che un'addizione e una sottrazione non dia un
risultato perfetto. Non ho parlato di moltiplicazioni e, soprattutto, di
divisioni. No, non lo accetterň mai!

 lassativo.
[Mode Fully Qualified, Verified, Independently Third-Party Tested and
Approved Bastard Inside ON]
    Sģ, ma il Vesuvio almeno fuma. :-P
[Mode Fully Qualified, Verified, Independently Third-Party Tested and
Approved Bastard Inside OFF]
Un Paperino che doveva chiedere un favore a Lupo, e ormai
s'č giocato tutte le possibilitą.

 a volte, quasi, riesci a farmi innvervosire, veramente.....
Mi dispiace, ma non mi pare si sia mai negato a nessuno di esprimere le
proprie convinzioni, e io mi sono spesso permesso di farlo. Credo che qui
sia più che lecito, per tutti e per ogni cosa. Ciascuno di noi ha, di
conseguenza, il diritto di essere d'accordo o meno, ha persino il diritto di
dirlo. Tu l'hai fatto, ma non per questo io ho cambiato idea. Il fatto che
la mia idea sia diversa dalla tua, credimi, non vuole affatto dire che io ti
tolgo il mio rispetto, tutt'altro.
Io non ho mai detto "voglio aver ragione io", ma, ancora, dico e urlo che
sbagliare una sottrazione e un'addizione è per me un'immensa stronzata,
talmente grande da non essere accettabile. Tu la accetti? Non capisco come,
ma ti rispetto. Io non la accetto, puoi rispettarmi lo stesso? ;-)

 che cambiare tutto non cambierebbe niente!
Mi rendo conto del nuovo atteggiamento e me ne dispiaccio.
Resto della mia idea e lascio perdere per non far troppo casino.

 s'è giocato tutte le possibilità.
No, dai. Sono un po' giù di corda (non per il fumo) e fra mezz'ora devo
uscire, ma dai, se posso, più che volentieri.

Punto.
Aspetta.
Ho capito l'errore di fondo.
E l'errore non è nei numeri in virgola mobile ne' in Lupo.
Tu dici: "Uso quel che mi si dà...".
Certo, non puoi fare altrimenti.
"... e se non va dico che non va".
Ecco: il problema è nella clasuola "non va".
In realtà "va". Va esattamente come deve andare, come specificato da chi ha
creato il tipo.
"Non va" perchè la tua aspettativa è differente dalle specifiche.
Puoi discutere le specifiche. Hai ragione il comportamento è aberrante.
Ma, preso atto che le specifiche non incontrano le tue aspettative e non le puoi
cambiare, devi cambiare tipo. Punto.
A questo punto entra in gioco la seconda frustazione di Lupo:
"ma perchè devo fare io ciò che avrebbe dovuto fare M$ o qualcun altro?"
Perchè M$ e tutti gli altri produttori di software hanno deciso di attenersi a
*quelle* specifiche. 
Aberrante anche questo. Però è così. 
Ne prendi atto e passi a qualcosa di più potente, magari creato da matematici di
professione.
<x:\termoPilucco>, 1-1<>0

 matematici di professione.
Ahhh, ma allora si può. Ma non s'era detto che è impossibile?
Allora posso lontanamente pensare di avere un po' di ragione se dico "un
mezzo ci deve essere solo che quelli hanno pensato di non adottarlo e quindi
mi devo smazzare io"? Posso.

     MsgBox c4
Lupo, sarà che non ho ancora mangiato, sarà che non ho capito
niente, ma a me dà 0, e non sono sicuro che sia un problema.
Ho fatto il conto a mano per essere sicuro di non sbagliare, e
anche con la calcolatrice, e mi viene sempre zero.
A te quanto dà ? 8-/
Bye, G.

 Bye, G.

 
In realta' si puo' lo stesso solo che, come ti e' gia' stato suggerito, 
quando fai una sottrazione con i double e' sempre necessario confrontare 
  il risultato con l'errore intrinseco della macchina:
se (a-b)< epsilon allora a=b
e cosi' via approssimando.
Con i numeri in virgola mobile e' sempre stato cosi'. Anzi si deve fare 
cosi'!!
E non ha senso scegliere i numeri che ti fanno comodo per affermare che 
con quelli funziona. Tu non lavori con 1, 2 ,3, ecc.  ma con la loro 
rappresentazione in virgola mobile. Almeno hai la certezza che lo steso 
numero ha sempre la stessa rappresentazione in virgola mobile!! Forse. :-)


mi devo smazzare io"? Posso.
Sě. Su questo hai ragione. Ma, come evidenziato, un metodo general purpose ha i
suoi pregi e i suoi difetti. Nella tua applicazione mostra tutti i suoi difetti,
in altre mostra i suoi pregi.
<x/:termoPilucco>

 devo uscire, ma dai, se posso, più che volentieri.
TNX :-)
In mail.
Bye, G.

 Il post originale cita quei numeri tutti con due decimali, quindi
Ah, ecco. Mi ero _davvero_ perso qualcosa :-)
Bye, G.

 solo c4?
Grazie a tutti per le risposte
ciaociao

 Scommettiamo!
Quello che vuoi Lupo... :-)
Il currency é un numero a virgola fissa, il double a virgola mobile,
l'implementazione é completamente diversa! Cerca IEEE754 per i single e
raddoppia per i double... :-)
    Ciao
        Allanon
-- 
- SPAMKILLER
 lasciate il NOSPAM nell'indirizzo: 
itlangv...@michele.sytes.net
 e lasciate la parola SPAMKILLER nel corpo dell'email

 > (eresia!) .NET? ;-)
Ho letto la presentazione di VB in Whidbey (scritto giusto?)... Parlano di
Overloding di operatori... FAI POI TE... :-)


Dear Lupo...
Non so perché ti scrivo qui e non in risposta ad un qualsiasi altro
messaggio...
Il tuo problema non sta né in Microsoft, né in ISO, né da nessun'altra
parte...
Microsoft riceve processori che lavorano in binario e il binario in questo
momento é il tuo nemico...
Tempo fa avevo postato "delle funzioni che simulavano un processore a base
dieci"...
Puoi fartele... però anche lì stai attento che sarebbe opportuno che "ti
fermassi" ad un certo numero di cifre... finito... Sicuramente gli errori di
approssimazione sarebbero meglio tollerati dall'utente medio... Chiaro che
le prestazioni... hai detto pre... prestazioni??? :-)


 la .Count sembra non risentirne......TI SEMBRA GIUSTO, dico io?!?!?!
Ohhh.... me l'ero sempre chiesto e talvolta usavo delle variabili create ad
hoc... :-)
Comunque é un piccolo compromesso per un grande aumento di prestazioni! :-)


 prestazioni! :-)
For i = NomeCollezione.Count - 1 to 0 step -1
ecchecaspita! gli step negativi non li considera mai nessuno?
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 ecchecaspita! gli step negativi non li considera mai nessuno?
Eh eh... prova questo:
Dim b As Byte
For b = 6 To 1 Step -1
    Debug.Print b
Next
<x:termoPilucco>

 <x:termoPilucco>

 Next
sai che non ho capito perchè va in overflow?

 sai che non ho capito perchč va in overflow?
Perchč converte lo step nel tipo del counter.
Ma Byte non puň essere negativo.
Ciao
Alberto
-- 
"Tina, ta te tňta tinta un tac!"
"Te cat tac i tac, m'tac't un tac?"
"Me ca tac un tac a tč?
Tac'tel te l tň tac, tň!"

 Ma Byte non può essere negativo.
Woooooo!
:-)
-- 
MasterDavidex
23 - 118 - RA
Bmw 4Ever

Ciao!
Dim b As Byte
For b = 6 To 1 Step -1
    Debug.Print b
Next
Con 
VS.NET
 ti sottilinea il -1 e ti da un errore di compilazione:
Espressione costante non rappresentabile nel tipo "Byte".
...che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello, che bello, che bello, che bello, che
bello, che bello, che bello, che bello!
:-)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
Ok, la smetto... :-)


 ha scritto nel messaggio
news:bogge7$1dmins$1...@ID-67444.news.uni-berlin.de...

*****************OVERFLOW*******************
