Nombres premiers [Résolu]

Signaler
Messages postés
31
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
19 avril 2009
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Salut à tous !

Je programme un test de primalité (un nombre est premier ou pas) "assez efficasse"   :  5915833991189567 premier en moins de 10 sec avec 1.5GHtz
!

Helas, mon programme ne peut aller plus loin de 16 chiffres en décimal,car même si le nombre est impair :

m_NbTest / 2 - Int( m_NbTest / 2 ) = 0 ----->au lieu de 0.5 !

Cette erreur est due au fait que m_NbTest est arrondi en X * EY
Ex :
5,91583399118956 * 10^15

Ma question : Comment garder un Double en  écriture décimale ?

   Ma
tvit
c
h

7 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
OUPS, j'ai codé par habitude en fastcall, VB et autres ne sauraient pas s'en servir.
Je rectifies en stdcall.


L'addition donnerait un truc du genre:
__declspec(naked) __stdcall void UAdd128(BNUINT128 *a, BNUINT128 *b, BNUINT128 *dst)
{
  __asm {
    mov   [esp-4], edi
    mov   ecx, [esp+4]
    mov   edx, [esp+8]
    mov   edi, [esp+12]
    mov   eax, dword ptr[edx]
    add   eax, dword ptr[ecx]
    mov   [edi], eax
    mov   eax, dword ptr[edx+4]
    adc   eax, dword ptr[ecx+4]
    mov   [edi+4], eax
    mov   eax, dword ptr[edx+8]
    adc   eax, dword ptr[ecx+8]
    mov   [edi+8], eax
    mov   eax, dword ptr[edx+12]
    adc   eax, dword ptr[ecx+12]
    mov   [edi+12], eax
    mov   edi, [esp-4]
    ret   12
  }
}

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Aucune précision à attendre sur des flottants, pas faits pour ça.

ciao...
BruNews, MVP VC++
Messages postés
31
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
19 avril 2009

Salut à BruNews !
 
Ta réponse est trés claire, mais ne m'avance pas pour autant...

Mais si c'est un double, le PC connait toute les décimales non (c'est pas que des 0? )?
Ne peut on pas empecher la formation de ces flottants? Comment faire autrement sans ralentir le prog?

Merci d'avance :  Ma
tvit
c
h
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Un double ne retient au maxi que 16 chiffres en précision by design, va voir 'Représentation à virgule flottante IEEE' sur le web pour comprendre pourquoi.

Quand on a besoin de précision absolue, faut s'écrire une classe de grands entiers (viable en VB ???) ou utiliser une lib prête à l'emploi.

ciao...
BruNews, MVP VC++
Messages postés
133
Date d'inscription
mercredi 27 juin 2012
Statut
Membre
Dernière intervention
10 janvier 2012
1
Bonjour,
comme matovitch,  j'aimerai bien savoir comment on fait pour creer des entier de 128 bits par exemple.

D'avance, je vous remercie pour vos reponse.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Les langages interprétés ne sont pas faits du tout pour ce genre de sport, ça partirait sur des temps de calcul rédhibitoires.


Voilà le début (en C et ASM comme il se doit) qu'il faut mettre et compiler en DLL et qui sera à appeler depuis VB.


typedef struct _BNUINT128 {
  DWORD ua;
  DWORD ub;
  DWORD uc;
  DWORD uc;
} BNUINT128;


L'addition donnerait un truc du genre:
__declspec(naked) void UAdd128(BNUINT128 *a, BNUINT128 *b, BNUINT128 *dst)
{
  __asm {
    mov   [esp-4], edi
    mov   edi, [esp+4]
    mov   eax, dword ptr[edx]
    add   eax, dword ptr[ecx]
    mov   [edi], eax
    mov   eax, dword ptr[edx+4]
    adc   eax, dword ptr[ecx+4]
    mov   [edi+4], eax
    mov   eax, dword ptr[edx+8]
    adc   eax, dword ptr[ecx+8]
    mov   [edi+8], eax
    mov   eax, dword ptr[edx+12]
    adc   eax, dword ptr[ecx+12]
    mov   [edi+12], eax
    mov   edi, [esp-4]
  }
}

ciao...
BruNews, MVP VC++
Messages postés
133
Date d'inscription
mercredi 27 juin 2012
Statut
Membre
Dernière intervention
10 janvier 2012
1
La grande classe, je te remercie beaucoup.

A +++ cretthie