Newsgroup: it.comp.www.asp
Titolo: Sorpresa!

Avete provato ad eseguire il codice seguente ?
(VBScript)
dim mAltezzaCm, mAltezzaMm
dim mAltezzaMt, mAltezza
mAltezza = 11.1
mAltezzaMt = int(mAltezza/100) ' 0
mAltezzaCm = int(mAltezza) ' 11
mAltezzaMm = mAltezza - mAltezzaCm ' 0.1
Response. write mAltezza
Response.write "<br>"
Response. write mAltezzaMt
Response.write "<br>"
Response. write mAltezzaCm
Response.write "<br>"
Response. write mAltezzaMm
Mi da un errore di calcolo allucinante.
Antonino.

 (VBScript)
9,999999999996 * 10 elevato alla -2 fa proprio circa 0.1000000001
L'errore a livello di risultato non č cosě allucinante, ma c'č da capire per
quale motivo tira fuori queste cifre decimali....
MAh... misteri !!

 Mi da un errore di calcolo allucinante.
da' 9,99999999999996E-02, e non è sbagliato, è il risultato giusto perchè è
uguale a 0,09999999999999 che è circa uguale a 1. Il circa è dovuto al fatto
che il numero è reale e a qualche altra storia riguardante degli standard e
delle questioni di librerie che non ricordo bene, ma è una storia vecchia
come il cucco... se cerchi su internet trovi la spiegazione precisa.


Moderatore di it.comp.www.asp
http://www.aspitalia.com/
 Enjoy the .NET community!
http://www.dev2dev.it/
 La rete ha connesso nuove particelle!

se cerchi su internet trovi la spiegazione precisa.
Non cerco la spiegazione, anche perchè non vi può essere alcuna
spiegazione che giustifichi che :
11.1 - 11 <> 0.1 .
Saluti.

 quale motivo tira fuori queste cifre decimali....
Allucinante non č il amrgine di errore quanto il fatto
che vi sia l'errore.
Ma ti immagini, dopo avere scritto numerose righe di codice
con calcoli abbastanza complicati per la conversione di densita
e volumi di fluidi, e dopo diverse ore di debug vengo
a scoprire che il computer sbaglia a fare una differenza !
Anche perchč, per deformazione mentale, penso che l'errore
sia mio.

 11.1 - 11 <> 0.1 .
vediamo se ti basta questa come spiegazione (presa da aclune FAQ),
altrimenti ho un altro quintale di link con spiegazioni più dettagliate:
16) Lavorando con i numeri in virgola mobile, non riesco ad ottenere
    risultati precisi, perche`?
R)  E` normale, la rappresentazione dei numeri reali in base (base 10,
    base 2,...) e con un numero finito di cifre comporta inerentemente
    un errore di approssimazione. Ad esempio 1/3 in base 10 non puo`
    essere rappresentato con un numero finito di cifre, 1/10 che in base
    10 equivale a 0.1, in base 2 e` periodico (proprio come 1/3 in base
10).
    Infine ci sono anche i numeri irrazionali (es. sqrt(3)) che per
    loro natura non sono mai rappresentabili con precisione in alcuna
base.
    Cio` significa che lavorando con i numeri reali devi sempre
aspettarti
    risultati affetti da errori di approssimazione. Tali errori possono
essere
    anche molto significativi poiche` le operazioni aritmetiche tendono
    ad amplificarli.
    Per maggiori riferimenti, puoi leggere
    "Introduzione alla matematica computazionale"
    di R. Bevilacqua, D. Bini, M. Capovani, O. Menchi
    edito da Zanichelli

Era una notte buia e tempestosa e Antonino disse:
:: Ma ti immagini, dopo avere scritto numerose righe di codice
:: con calcoli abbastanza complicati per la conversione di densita
:: e volumi di fluidi, e dopo diverse ore di debug vengo
:: a scoprire che il computer sbaglia a fare una differenza !
:: Anche perchč, per deformazione mentale, penso che l'errore
:: sia mio.
Hai perfettamente ragione... e dico a Bochicchio che anche usando le
dichiarazioni corrette invece di variabili variant... il risultato cambia,
ma non č ancora corretto:
mAltezza = csng(11.1)
mAltezzaMt = cint(mAltezza/100) ' 0
mAltezzaCm = cint(mAltezza) ' 11
mAltezzaMm = csng(mAltezza - mAltezzaCm) ' 0.1
da come risultato
11,1
0
11
0,1000004 e non 0,1 !!!
Grazie di averci avvisati... terrň sempre presente questa cosa in futuro
!!!!

    edito da Zanichelli
Programmo con i computer dalla CPU 8088 (Olivetti M19, MSDOS 3.00, Masm), la
mia esperienza mi basta per capire che c'è qualcosa che non va.
Ti ringrazio, comunque, per l'indicazione.
Contestualmente, ti allego la versione in c del programma.
Sapresti spiegarmi perche' la versione in c (Visual C++) funziona
correttamente ?
main() {
 double Var1;
 int Var2;
 Var1=11.1;
 Var2=11;
 printf("%f", Var1-Var2);
}
P.S. Chissa cosa ne pensa un matematico! Sarei proprio curioso di
chiederglielo.

 correttamente ?
perchè in C tu dichiari il tipo di variabile. in vbs no. vedi il mio post
precedente.


 correttamente ?
ora mi fai venire qualche dubbio... prova ad utilizzare entrambi i numeri
double, poi memorizza prima il risulato della sottrazione in un double e poi
stampalo (non vorrei che ci fosse qualche cast "nascosto")

 era parte integrante della faq da cui ho fatto copia e incolla!
Ok, no problem :))
Mi ero sentito, per un attimo, punzecchiato nell'orgoglio :))

 ha scritto nel messaggio
news:ampo05$801fp$1...@ID-109207.news.dfncis.de...

L'errore c'è, è del calcolatore ed è innegabile.
Puoi ovviare col comando FormatNumber utilizzando un numero ragionevolmente
piccolo di cifre decimali (<16):
Response.Write(FormatNumber(mAltezzaMm, 2)) 'dove 2 è il numero di cifre
decimali
'okkio: con 
vb.net
 tale funzione restituisce una stringa non un double
'con vbscipt "normale" non lo so e probabilmente non fa differenza
A Q V A R I V S