2016-05-08 11 views
5

Qual è la differenza tra:Come funziona qFuzzyCompare in Qt

if(a == b) 

e

if(qFuzzyCompare(a, b)) 

dato che le variabili a e b sono:

a = 1234.5678 
b = 1234.5678 

Nota: I' Sto chiedendo perché ho problemi a confrontare i doppi in Qt e voglio capire come funziona qFuzzyCompare.

risposta

7

Il official documentation per qFuzzyCompare() non ha realmente spiegare perché si potrebbe usare questo, ma in generale si confrontano i valori in virgola mobile è considerato una cattiva pratica perché due variabili floating point apparentemente identici possono essere trovati differire a causa di errori di arrotondamento. Puoi leggere ulteriori informazioni su questo e altri trucchi delle variabili in virgola mobile here.

Se si guarda a codice sorgente per qFuzzyCompare() per la doppia e galleggiare, rispettivamente, come spedito con Qt5.6.0 (Tenere premuto CTRL e fare clic sulla funzione per vedere questo in QtCreator), si può dedurre che si cerca di ridurre la probabilità di inesattezze per ottenere nel senso di un test di uguaglianza:

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED; 
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) 
{ 
    return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2))); 
} 

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED; 
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) 
{ 
    return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2))); 
} 
+0

non è * una cattiva pratica * è completamente sbagliato confrontare floating point variabili con un solo '' == – ixSci

+0

Questa funzione permette di ipotesi circa il valore di epsilon. Quali sono gli avvertimenti sull'utilizzo di Qt epsilon e non la definizione a mano? Gli avvertimenti di –

+0

non lo so, ma usarlo significa che userete lo stesso epsilon usato dal resto di Qt che potrebbe salvarvi da sottili errori derivanti dall'uso di epsilon diversi in calcoli intrecciati. –