2010-02-22 2 views
3

나는 해결할 수없는 문제가 있습니다. 내 숫자가 상대성 소수인지 판단하기 위해 무작위로 숫자를 생성하고 있습니다. 여기 rand()에 의한 부동 소수점 예외 C++에서

나에게 부동 소수점 예외를 제공하는 기능입니다 :

나는 무작위 씨는 다음을 수행하여 다른 기능에서 한
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; 
} 

:

srand(time(NULL)); 

는 당신의 도움을 주셔서 감사합니다 !

+0

으로 나누기가 while 루프에서 오른쪽으로 exponent 이동하고 생성 된? –

답변

5

당신은 그래서 두 번째는 base = rand() % exponent;exponent이 0에 도달하고 "부동 소수점 예외가"0

+1

잘 찾아낸 '지수'는 0으로 하향 이동하고 있으며, 0에 대한 경계가 없습니다. – Justicle

+0

잘 잡으세요. 인수를 const로 만듭니다. 함수 내에서 값 인수로 전달을 변경하면 이러한 종류의 버그가 숨겨집니다. 각 경우에 계수를 수행하기 직전에 0을 확인하십시오. – thebretness

+0

대단히 감사합니다! 나는 단지 그것을 보지 못했다. – Alex

4

exponent 값은 0입니까? 그렇다면 거기에 0으로 나누기 예외가 있습니다. 이 0
에 도달 할 때까지

+0

지수가 0이 아닙니다. – Alex

+0

둘 다 modulus가 있기 때문에 modulus와 exponent 변수를 모두 0으로 체크해야합니다. – thebretness

+0

@Alex 당신은 더 많은 도움이 될 수 있습니다 - 예외는 무엇이고'rand()'와'exponent'의 값은 무엇입니까? – Justicle