Newsgroup: it.comp.lang.c++
Titolo: Volete rimanere senza parole? prego...

//    Primo "stupimento" :
double v1 = 69.82;
double v2 = 69.20;
double v3 = 0.62;
double v4 = v2 + v3;
BOOL e = (v4 == v1);
////////////////////////////////////////////////////////////////////////////
///////////////////
//    e se non bastasse... :
double x1 = 301.84 - 301;
////////////////////////////////////////////////////////////////////////////
///////////////////
Questo č impegnativo, vediamo chi mi sa dare la spiegazione giusta... (non
che non sappia il perchč, intendiamoci...)

 BOOL e = (v4 == v1);
[...cut...]
Intanto faresti meglio a scrivere delle domande, perché non si capisce bene
cosa tu voglia chiedere. Comunque, se per caso il tuo "stupimento" riguarda
il fatto che la variabile 'e' risulta falsa (contrariamente a quanto si
potrebbe logicamente pensare), direi che è abbastanza ovvio sapendo che la
rappresentazione dei numeri in virgola mobile è sempre approssimata. Due
operazioni che in realtà darebbero lo stesso risultato, quando vengono
eseguite su numeri a precisione finita possono dare luogo a due
approssimazioni diverse dello stesso risultato.
Regola d'oro:
    ** mai confrontare due numeri in virgola mobile per uguaglianza **
Ciao,
Marco

...

Nel caso servisse un confronto tra due numeri in virgola mobile com'è
possibile ovviare al problema? (se esiste una soluzione) mantenendo la
stessa precisione originale ...
Per esempio se si stà sviluppando un software dove la precisione
matematica è fondamentale (misurazioni microsocopiche) come sarebbe
possibile risolvere il problema ?

 stessa precisione originale ...
... Ovvio: riscrivendo una classe "ad hoc" per il trattamento di numeri in
virgola mobile a precisione arbitraria che utilizzi una rappresentazione
bit-a-bit del numero.
Ciao!
*** Azimuth ***

 possibile risolvere il problema ?
E' indispensabile studiare un buon testo di algoritmi numerici.
Ciao,
Nicola

 bit-a-bit del numero.
Non mi e' chiaro cosa intendi.
Ciao,
Nicola

 Non mi e' chiaro cosa intendi.
Scusatemi: rappresentazione cifra per cifra del numero.
Sorry!
*** Azimuth ***


In ambito finanziario sarei d'accordo, anche se e' magari piu' efficace
shiftare il numero in modo da far diventare intere le cifre decimali
siginificative (ad esempio moltiplicando le somme in euro per mille o
diecimila prima di fare le operazioni).
In ambito scientifico temo sia uno sforzo sprecato, perche' rende i
calcoli particolarmente inefficienti e perche' molte funzioni
matematiche di per se possono essere calcolate solo in modo
approssimato. A meno che lo scopo del programma non sia di trovare le
cifre decimali del pi greco...
Ciao,
Nicola

 approssimato.
Non credo che, a questo punto, abbia molto senso rinunciare
all'approssimazione della rappresentazione IEEE.
Temo in ogni caso che efficienza e precisione non possano andare a
braccetto. :)
Ciao.
*** Azimuth ***
[1] Ovviamente non mi ricordo esattamente quali sono, quindi piu' avanti di
cosi' non mi sporgo. :)

 possibile risolvere il problema ?
Usare delle librerie ad hoc.
Mai usate, per cui non so dirti, ma se cerchi ne trovi...
--
Gerolamo

 E' indispensabile studiare un buon testo di algoritmi numerici.
sbaglio o ci sono linguaggi creati apposta per eseguire calcoli numerici con
precisione arbitraria? (mi viene in mente bc di linux, ma potrei
sbagliarmi....)
Raffaele

 sbagliarmi....)
Mi aspetto che sia cosi' per strumenti come MathLab o Mathematica, ma
non li conosco.
Ciao,
Nicola