Comparer deux tableaux bidimensionnelle de double

cs_Jutsuu Messages postés 4 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 juin 2009 - 13 juin 2009 à 11:22
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 13 juin 2009 à 23:42
Bonjour à tous,

Je vous expose mon problème j'ai donc deux tableau de double tab1[10][50] et tab2[10][50], je voudrais comparer chaque ligne sur 50 valeurs distinctes prédéfinies avec un taux d'erreur allant de plus ou moins 5 sur la comparaison.

Merci d'avance.

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2009 à 22:25
JUSTE POUR LE FUN, NE PAS RALER (faut bien se divertir un samedi soir).
J'ai réduit le test sur 4 valeurs au lieu de 500 (10 * 50).
Pour ton cas, suffira d'appeler:
BYTE btres[10][50];
EcartDbl5PZ(tab1, tab2, 500, btres);
btres sera rempli de 1 si diff >= 5.0 sinon 0.
---------------------------------


double tabA[4] = {1.2, 12.8, 24.5, -58.2};
double tabB[4] = {0.5,  1.0, 20.0, -59.7};


char szappname[] = "dblCOMP";


const DWORD BN32ABS[2] = {0x7FFFFFFF, 0xFFFFFFFF};
const double CINQPZ = 5.0;


__declspec(naked) void __fastcall EcartDbl5PZ(double *pA, double *pB, DWORD nElems, BYTE *pRes){ // ECX pA, EDX pB, [esp+4] = nElems, [esp+8] = pRes
  __asm {
    mov     eax, [esp+4]
    mov     [esp-4], edi
    test    eax, eax
    je      short dblEXIT
    mov     edi, [esp+8]
    movsd   xmm2, qword ptr BN32ABS
    movsd   xmm3, qword ptr CINQPZ
tabsCMP:
    movsd   xmm0, qword ptr[ecx]
    movsd   xmm1, qword ptr[edx]
    mov     byte ptr[edi], 0
    ucomisd xmm0, xmm1
    je      short tabsNEXT
    jb      short aINFb
    subsd   xmm0, xmm1
    andpd   xmm0, xmm2
    ucomisd xmm0, xmm3
    jb      short tabsNEXT
    jmp     short diffSUPEQU
aINFb:
    subsd   xmm1, xmm0
    andpd   xmm1, xmm2
    ucomisd xmm1, xmm3
    jb      short tabsNEXT
diffSUPEQU:
    mov     byte ptr[edi], 1
tabsNEXT:
    add     ecx, 8
    add     edx, 8
    add     edi, 1
    sub     eax, 1
    jne     short tabsCMP
    mov     edi, [esp-4]
dblEXIT:
    ret     8
  }
}


void tstEcartCinq(VOID)
{
  BYTE btres[4];
  char buf[4];
  int i;
  EcartDbl5PZ(tabA, tabB, 4, btres);
  for(i = 0; i < 4; i++) {
    *((DWORD*) buf) = btres[i] ? 0x49554F : 0x4E4F4E;
    MessageBox(0, buf, szappname, 0);
  }
}

ciao...
BruNews, MVP VC++
0
cs_Jutsuu Messages postés 4 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 juin 2009
13 juin 2009 à 22:48
Esque tu pourrais m'expliquer ton code? je n'ai pas tout compris :s en tout cas merci de ton aide.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juin 2009 à 23:42
bah, qu'en dire...
L'ASM c'est plus simple tu meurs, te suffit d'ouvrir les manuels Intel et de suivre la séquence d'instructions, tu devrais piger illico.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous