Per numeri interi, ==
fa esattamente quello che ti aspetti. Se sono uguali, sono uguali.
Per i galleggianti, è un'altra storia. Le operazioni producono risultati imprecisi e gli errori si accumulano. Devi essere un po 'confuso quando si tratta di numeri. Io uso
if (std::abs(a - b)
< std::abs(a) * (std::numeric_limits<float_t>::epsilon() * error_margin))
dove float_t
è un typedef; questo mi dà la massima precisione possibile (supponendo che error_margin sia stato calcolato correttamente) e consenta una facile regolazione ad un altro tipo.
Inoltre, alcuni valori a virgola mobile non sono numeri: c'è infinito, meno infinito e ovviamente non un numero. ==
fa cose divertenti con quelli. L'infinito è uguale a infinito, ma il non-a-numero non è uguale a un numero.
Infine, ci sono zero positivi e negativi, che sono distinti ma uguali tra loro! Per separarli, devi fare qualcosa come controllare se l'inverso è infinito positivo o negativo. (Assicurati solo di non avere un'eccezione divisa per zero.)
Quindi, a meno che non si dispone di una domanda più specifica, spero che lo gestisce ...
per intero == è sufficiente – malay
E il codice con == è più pulito e più leggibile. – Igor
Il secondo test è in realtà un test per la disuguaglianza. – rlbond