Newsgroup: it.comp.lang.c++
Titolo: Ancora i double!!!

Se metto:
double a=0.6;
double b=0.6;
(a<b) viene valutato come true dal C++Builder 3.0
E' la solita questione dei double? Qual'e' la maniera piu' efficiente di
ovviare a questo problema?
=========================================================
    Christian Prinoth        For replies please remove
 
c.pr...@flashnet.it
     ANTISPAM from the address
=========================================================
     Homepage: 
http://village.flashnet.it/~fn023975/
=========================================================
                     ICQ: #23472797
=========================================================
    PGP Public key available on request - Fingerprint:
    B69F 01B0 5558 9094 55EF  3572 EED1 6F1B DAFF 2853
=========================================================

ovviare a questo problema?
Sei sicuro che il codice riportato sopra sia identico a quello da te scritto?
Non e` affatto normale un comportamento simile, il contenuto di a e b
deve essere identico e quindi il test dovrebbe risultare falso.
E in effetti col mio compilatore (BC++ 5.02) non ho alcun problema.
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
  e-mail: 
mar...@cli.di.unipi.it
 
-----------------------------------------------

Sei sicuro di aver fatto proprio come scrivi?
A me (Builder 3) funziona tutto bene:
double a = 0.6;
double b = 0.6;
if (a < b) Edit1->Text = "a minore di b";  // questa frase NON viene
visualizzata
--
Byez.
Stefano Tempesta
temp...@tin.it
http://tempesta.freeweb.org
--------------------------------
(-: To "shut down" your system, type "WIN" :-)
(-: Windows VirusScan 1.0 - "Windows found: Remove it? (Y/N)" :-)

ovviare a questo problema?
No, non e` "la solita questione"; a norma di standard, un
compilatore puo` fornire risultati double diversi per diverse
sequenze di calcolo (anche se sarebbero matematicamente
equivalenti sui numeri reali), ma NON per la STESSA
sequenza, e qui a e b provengono dalla stessa sequenza
(la sequenza vuota composta da "nessun calcolo").
Se la tua osservazione e` corretta, hai allora scoperto un
bug (apparentemente serio) del compilatore C++B 3, e
la maniera piu` efficiente di risolverlo potrebbe essere
vedere sul sito Inprise (ex-Borland) se hanno gia` dei fix,
o, se no, "fare pressione" perche` li mettano...!
Alex

E in effetti col mio compilatore (BC++ 5.02) non ho alcun problema.
Il codice esatto e':
    for(int i=0;i<size;i++)
    {
        for(int j=bins;j>=0;j--)
        {
            if(array[i]>cp[j]) {freq[j]++;break;}
        }
    }
Quando sia array[i] che cp[j] (entrambi array di double) assumono il
valore 0.6 freq[j] viene incrementato, cosa che non dovrebbe accadere.
Invece funziona se sostituisco la condizione con:
       if(correct(array[i]-cp[j],0)>=0) {freq[j]++;break;}
dove:
double EPSI=0.000000000000001;
double correct(double tocheck, double against)
{
    if(fabs(tocheck-against)<EPSI)
        return against;
    else
        return tocheck;
}
Accetto suggerimenti :)


Accetto suggerimenti :)
???????????????????????????
Il fatto che ad altri con il BCB 3.0 tutto funziona mi fa pensare solo a due possibilita`
1) Un bug nel BCB corretto da una patch che tu non hai (strano pero` perche` BCB e BC++5.00
se non erro condividono lo stesso compilatore, ma qui` potrei sbagliarmi)
2) (e qui voglio sbagliarmi...) bug hardware.
Comunque in verita` non saprei che dirti.
Prova a contattare Borland!!!!!!!!


Accetto suggerimenti :)
Suggerimento: se non hai una grossa pratica e preparazione in
termini di calcolo numerico, ti conviene probabilmente tenere
un "margine di sicurezza" come hai fatto nella tua correct().
Alex

Ho provato il tuo codice e... funziona benissimo: nessun problema! Ai due
array ho assegnato valori a compile-time, ossia non provenienti da calcoli
precedenti. Non e' che a te i valori degli array sono frutto di qualche
calcolo che fa perdere, magari, precisione?
Io uso BCB3 Pro con la patch 1. Se vuoi che faccia qualche altro test,
mandami i valori dei due array, cosi' vedo un po' da me cosa succede...
