_finite vs _isnan vs 0x7FC00000
voici mon 2eme bench.
Il s'agit maintenant le méthode la plus rapide pour tester si un float est fini.
le header <float.h> met à disposition 2 fonctions : _isnan et _finite.
Une autre méthode consiste à comparer la valeur du float à 0x7FC00000, en convertissant son pointeur en un pointeur sur un long.
voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| int i;
int nvalid;
CString strt;
MTDebugMessage(strModule, strFunction, "finite Début ");
nvalid=0;
for (i=0; i<m_nSize; i++)
{
if (_finite(m_pData[i]))
nvalid++;
}
strt.Format("%d - %d",m_nSize , nvalid);
MTDebugMessage(strModule, strFunction, "finite Fin -"+strt);
MTDebugMessage(strModule, strFunction, "isnan Début ");
nvalid=0;
for (i=0; i<m_nSize; i++)
{
if (!_isnan(m_pData[i]))
nvalid++;
}
strt.Format("%d - %d",m_nSize , nvalid);
MTDebugMessage(strModule, strFunction, "isnan Fin -"+strt);
MTDebugMessage(strModule, strFunction, "long lnan Début ");
nvalid=0;
unsigned long *pF;
for (i=0; i<m_nSize; i++)
{
pF=(unsigned long*) &(m_pData[i]);
if (*pF!=0x7FC00000)
nvalid++;
}
strt.Format("%d - %d",m_nSize , nvalid);
MTDebugMessage(strModule, strFunction, "long lnan Fin -"+strt); |
MTDebugMessage sert juste à ecrire un message daté dans un fichier de log.
Résultat par colonne methode - nombre de valeurs - nombre de valid - temps:
finite 12*582*912,00 4*388*733,00 0,078
isnan 12*582*912,00 4*388*733,00 0,109
0X7. 12*582*912,00 4*388*733,00 0,016
Il n'y a pas photo, mieux vaut la méthode 3.
Des remarques ?