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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?