2013-10-15 72 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 ,除以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,然后除以零。除以零保证​​SIGFPE(至少在x86和amd64上)。尽管有名字,但它与浮点数无关。

+0

'SIGFPE'是一个Unix/Posix信号,不是x86或ARM的要求。 –

+0

@EricPostpischil肯定的事情。不确定在其他CPU上除以零时是否需要触发,因此 - 这就是为什么注释。还有很多SIGFPE可能发生的其他事情,但结果只是一个安静的NaN。 – keltar

0

打印NUM1%的操作,它得到0之前的值,然后你例外除以0