Ottengo questo frammento di codice da qualcun altro. Secondo il webmaster, il codice viene scelto da The art of computer programming by KnuthDifferenza tra approssimativamente Equal ed essenzialmente Equal in L'arte della programmazione per computer
Poiché non ho una copia di quel libro, posso sapere qual è la differenza tra le due funzioni?
bool approximatelyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
bool essentiallyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ((fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
Posso dire che essenzialmenteEqual avrà sempre bisogno di un valore 'più vicino 'di approssimativamente Equal? –
Sì, i valori 'essentialEqual' saranno sempre" più vicini "rispetto ai valori di' approssimativamente Equal'. – palswim
Pensa alle offerte del tuo negozio abituale e quali sono le percentuali. Cosa c'è di più prezioso del 33% di sconto sul prezzo o del 33% di prodotto extra gratuito? La soluzione è che dovresti preferire lo sconto del 33% in quanto equivale a un'offerta del 50% extra libera. Lo stesso accade qui, a seconda che tu prenda l'epsilon attorno al maggiore o al più piccolo dei due valori, il risultato sarà diverso. 66,6 è approssimativamente uguale a 100 con un epsilon al 33%, ma sostanzialmente uguale a un epsilon al 50%. –