当前位置:  开发笔记 > 后端 > 正文

不分零的浮点异常

如何解决《不分零的浮点异常》经验,为你挑选了1个好方法。

我编译了代码,但它在执行时给出了浮点异常

#include
int fibonacci(int n)
{
  int a=0,b=1,c;
  while((n-1)>0)
  {
    c=a+b;
    a=b;
    b=c;
    n--;
  }
  return c;
}
int main()
{
  int t,a,b,c;
  scanf("%d",&t);
  while(t--)
  {
    scanf("%d%d",&a,&b);
    while(a--)
    {
      b=fibonacci(b);
    }
    printf("%d",(b%c));
   }
  return 0;
 }

我该怎么做才能解决这个问题?



1> moooeeeep..:

我该怎么做才能解决这个问题?

解决这个问题的第一件事是查看编译器能够为您提供的提示.也就是说,启用warnings(-Wall)和调试符号(-g):

$ gcc test.c -Wall -g
test.c: In function ‘main’:
test.c:25:11: warning: ‘c’ may be used uninitialized in this function [-Wuninitialized]

c第25行中的变量可能有问题,这正是print语句:

printf("%d",(b%c));

让我们看看运行时会发生什么:

$ ./a.out
1
2
3
Floating point exception (core dumped)

啊,好吧,它失败了.但它是如何崩溃的呢?这是gdb的一个用例:

$ gdb ./a.out
GNU gdb (GDB) Fedora (7.5.1-37.fc18)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /home/moooeeeep/a.out...done.
(gdb) run
Starting program: /home/moooeeeep/a.out 
1
2
3

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400640 in main () at test.c:25
25      printf("%d",(b%c));
Missing separate debuginfos, use: debuginfo-install glibc-2.16-30.fc18.x86_64

就在第25行.可疑.让我们检查一下变量的内容:

(gdb) print b
$1 = 1
(gdb) print c
$2 = 0

该变量c确实为零.但是,当只有整数时,它为什么会导致浮点异常?(其他人在您之前已经观察过这一点.)正如您在调试器中看到的那样,它被称为算术异常 (cf):

SIGFPE信号报告致命的算术错误.尽管名称源自"浮点异常",但该信号实际上涵盖了所有算术错误,包括除以零和溢出.

让我们看看valgrind告诉我们的内容:

$ valgrind ./a.out
==3113== Memcheck, a memory error detector
==3113== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==3113== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==3113== Command: ./a.out
==3113== 
1
2
3
==3113== 
==3113== Process terminating with default action of signal 8 (SIGFPE)
==3113==  Integer divide by zero at address 0x403E58A5B
==3113==    at 0x400640: main (test.c:25)
==3113== 
==3113== HEAP SUMMARY:
==3113==     in use at exit: 0 bytes in 0 blocks
==3113==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==3113== 
==3113== All heap blocks were freed -- no leaks are possible
==3113== 
==3113== For counts of detected and suppressed errors, rerun with: -v
==3113== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
Floating point exception (core dumped)

valgrind在第25行确定了一个零整数除法.您应该关注该行(以及所涉及的变量)!


请注意,大多数IDE(例如,Eclipse)都有(某些)这些工具直接集成,这使得调试真的很有魅力.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有