Ho scritto una funzione che testa due numeri in virgola mobile per un'uguaglianza approssimativa (vedi questa domanda di revisione del codice ). Mi piacerebbe testare la mia funzione unitaria, ma non sono sicuro del modo migliore per farlo. Ovviamente potrei scegliere alcuni numeri arbitrari che dovrebbero essere uguali all'interno della soglia, ma mi sembra molto più utile testare che i calcoli reali che dovrebbero essere uguali ma fallire un ingenuo test di uguaglianza (a causa di errori di arrotondamento) sono considerati uguali dal mio la funzione.
È valido o dovrei semplicemente scegliere i miei numeri magici e muovermi? Esistono casi / esempi di test standard che le persone hanno storicamente utilizzato? Ho cercato di trovare qualcosa, ma tutto ciò che ho trovato era un mucchio di riferimenti che spiegavano perché non dovevo usare l'uguaglianza esatta nei test in virgola mobile, che già conosco.
Ad esempio, potrei scrivere un test come questo (usando gtest):
template <typename FP>
class FloatEquality {
protected:
FP left, right, diff;
std::size_t ulps;
virtual void SetUp()
{
left = 2.0;
right = 2.1;
diff = .2;
}
};
TYPED_TEST_CASE_P(FloatEquality);
TYPED_TEST_P(FloatEquality, MagicNumbers)
{
EXPECT_TRUE(nearlyEqual(this->left, this->right, this->diff, this->ulps));
}
REGISTER_TYPED_TEST_CASE_P(FloatEquality, MagicNumbers);
using FloatingPointTypes= ::testing::Types<float, double>;
INSTANTIATE_TYPED_TEST_CASE_P(FloatingPoint, FloatEquality, FloatingPointTypes);
Questi numeri ovviamente non sono una grande scelta, ma esemplificano i tipi di numeri magici che potrei scegliere qui che sarebbero in grado di controllare tutte le mie scatole e darmi una buona copertura del codice, ma non sembrano così significativo.
Alla fine ho trovato un esempio di qualcuno che lo testava, ma questo è il numero magico approccio. I numeri sembrano essere ragionevolmente ben scelti, ma sembra che non stiamo ancora testando la cosa giusta.