2013-10-15 2 views
-1

Linux에서이 프로그램을 실행할 때 부동 소수점 예외가 발생합니다.부동 소수점 예외 이유 (Linux)

#include<stdio.h> 
#include<math.h> 
int main() 
{ 
    int num, num1, num2, n, i, j = 0, t, count = 0; 
    int root; 

    printf("Enter number of test cases\n"); 
    scanf("%d", &t); 
    while (j < t) 
    { 
     scanf("%d", &num); 
     root = (int)sqrt(num); 
     for (i = 1; i < root; i++) 
     { 
      printf("Inside for"); 
      if (num % i == 0) 
       num1 = i; 
      while (num1 > 0) 
      { 
       n = num1 % 10; 
       num1 = num1/10; 
       if (n == 3 || n == 5 || n == 6) 
        count++; 
      } 
      if (num % num1 == 0) 
      { 
       num2 = (int)num/num1; 
       while (num2 > 0) 
       { 
        n = num2 % 10; 
        num2 = num2/10; 
        if (n == 3 || n == 5 || n == 6) 
         count++; 
       } 
      } 
     } 
     j++; 
     count = 0; 
     printf("%d", count); 
    } 
    return 0; 
} 

는 사람이 어떻게 수정을 가르쳐 주시겠습니까 그것을

+0

코드를 들여 쓰고 싶을 수도 있습니다. 그러면 코드를 훨씬 더 쉽게 읽을 수 있습니다. –

+0

코드를 들여 쓰거나 프로그램이 충돌하는 줄을 알 수 있다면 도움이 될 것입니다. – Tarik

+0

부동 소수점을 사용하는 유일한 장소는'sqrt' 호출입니다. 예외가 발생하면'num'의 값은 무엇입니까? –

답변

0

에 의한 부문의 다음 예외 : 당신이 볼 수 있듯이

Starting program: /home/david/demo 
Enter number of test cases 
2 
10 

Program received signal SIGFPE, Arithmetic exception. 
0x000000000040076d in main() at demo.c:26 
26    if (num % num1 == 0) 
(gdb) p num1 
$1 = 0 
(gdb) 

num1의 값이 0을 , division by 0

1
while (num1 > 0) 
    { 
     n = num1 % 10; 
     num1 = num1/10; 
     if (n == 3 || n == 5 || n == 6) 
      count++; 
    } 
    if (num % num1 == 0) 

NUM1 후 0으로 나누어, 0이되지 않는 한 당신은 루프를 압연. 0으로 나눈 값은 SIGFPE (x86 및 amd64 이상)에서 보장됩니다. 이름에도 불구하고 부동 소수점 숫자와 아무 관련이 없습니다.

+0

'SIGFPE'는 x86이나 ARM 요구 사항이 아닌 Unix/Posix 신호입니다. –

+0

@EricPostpischil 확실한 것. 다른 CPU에서 0으로 나눌 때 트리거하는 것이 _required_ 인 지 확실하지 않으므로 발언입니다. SIGFPE가 발생할 수있는 많은 다른 것들이 있지만 조용한 NaN만이 있습니다. – keltar

0

를 인쇄 % 작업, 그것은 0지기 전에 NUM1의 가치와 디버거를 사용하여 0