Nombres premiers

Résolu
matovitch Messages postés 31 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 19 avril 2009 - 21 oct. 2007 à 13:33
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 oct. 2007 à 21:42
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 oct. 2007 à 21:42
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++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 oct. 2007 à 16:58
Aucune précision à attendre sur des flottants, pas faits pour ça.

ciao...
BruNews, MVP VC++
0
matovitch Messages postés 31 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 19 avril 2009
21 oct. 2007 à 18:15
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 oct. 2007 à 18:33
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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cretthie Messages postés 133 Date d'inscription mercredi 27 juin 2012 Statut Membre Dernière intervention 10 janvier 2012 1
21 oct. 2007 à 20:54
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 oct. 2007 à 21:24
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++
0
cretthie Messages postés 133 Date d'inscription mercredi 27 juin 2012 Statut Membre Dernière intervention 10 janvier 2012 1
21 oct. 2007 à 21:41
La grande classe, je te remercie beaucoup.

A +++ cretthie
0
Rejoignez-nous