2010-02-22 6 views
3

J'ai un problème que je n'arrive pas à résoudre. Je génère aléatoirement des nombres afin de déterminer si mes nombres sont la relativité prime.Exception en virgule flottante provoquée par rand() En C++

Voici la fonction qui me donne un point flottant Exception:

bool modularExponentiationTest(unsigned long long exponent, unsigned long long modulus) 
{ 
    short index = 0; 
    unsigned long long base; 
    unsigned long long result; 

    do 
    { 
      result = 1; 
      base = rand() % exponent; // <--CAUSED BY THIS 

      while (exponent > 0) 
      { 
       if (exponent & 1)  
         result = (result * base) % modulus; 
       exponent >>= 1; 
       base = (base * base) % modulus; 
      } 

      if (result != 1) 
       return false; 
    }while(++index < 10); 

    return true; 
} 

Je l'ai graines au hasard dans une autre fonction en procédant comme suit:

srand(time(NULL)); 

Merci beaucoup pour votre aide !

+0

Quelle « exception à virgule flottante » est généré? –

Répondre

5

Vous êtes déplacer exponent à droite dans la boucle while jusqu'à atteindre 0.
donc la deuxième fois que vous atteignez base = rand() % exponent;exponent est 0 et vous avez une division par 0

+1

Bien repéré, 'exposant' est en train d'être rétrogradé à zéro, et il n'y a pas de garde contre zéro. – Justicle

+0

Bonne prise. Faites vos arguments const. Modifier les arguments passer par valeur à l'intérieur d'une fonction cache ce genre de bug. Vérifiez zéro avant d'exécuter le module dans chaque cas. – thebretness

+0

Merci beaucoup! Je n'ai juste pas vu ça. – Alex

4

La valeur de exponent est-elle nulle? Si oui, une exception de division par zéro est là.

+0

L'exposant n'est pas nul. – Alex

+0

Vous devriez probablement vérifier les variables de module et d'exposant pour zéro puisque vous modulez avec les deux. – thebretness

+0

@Alex vous pourriez être plus utile - quelle est l'exception générée et quelle est la valeur de 'rand()' et 'exponent'? – Justicle

Questions connexes