免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4727 | 回复: 2
打印 上一主题 下一主题

[C] 编译没有问题,运行时报Floating point exception,没有浮点运算。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-17 23:14 |只看该作者 |倒序浏览
本帖最后由 joker0910 于 2012-12-18 21:45 编辑
  1. Linux ubuntu 2.6.32-40-generic #87-Ubuntu SMP Mon Mar 5 20:26:31 UTC 2012 i686 GNU/Linux
  2. Using built-in specs.
  3. Target: i486-linux-gnu
  4. Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
  5. Thread model: posix
  6. gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
复制代码
这是我的运行/编译环境。 编译如下代码之后, 在本机执行, 立刻在终端上打印"Floating point exception"
  1. 279 lunar_set_st *lunar_set_inter(lunar_set_st *pset_a, lunar_set_st *pset_b)
  2. 280 {
  3. 281     lunar_set_st *pnew = NULL;
  4. 282
  5. 283     if(pset_a == NULL) {
  6. 284         pnew = lunar_set_new(pset_b->size, pset_b->cmp, pset_b->hash);
  7. 285     } else if(pset_b == NULL) {
  8. 286         pnew = lunar_set_new(pset_a->size, pset_a->cmp, pset_b->hash);
  9. 287     } else if(pset_b->length < pset_a->length) {
  10. 288         return lunar_set_inter(pset_b, pset_a);
  11. 289     } else {
  12. 290         pnew = lunar_set_new(ARITH_MIN(pset_a->size, pset_b->size),
  13. 291                             pset_a->cmp, pset_a->hash);
  14. 292         if(pnew == NULL) {
  15. 293         //  dblog("get new set failed!");      /* 这句如果注释掉,那么程序正常, 如果没有注释掉,就会在执行时,报Floating point exception  */
  16. 294             return NULL;
  17. 295         }
  18. 296         struct member *p = NULL;
  19. 297         int i = 0;
  20. 298         for(i = 0; i < pset_a->size; i++) {
  21. 299             p = pset_a->buckets[i];
  22. 300             while(p) {
  23. 301                 if(lunar_set_member(pset_b, p->member)){
  24. 302                     lunar_set_put(pnew, p->member);
  25. 303                 }
  26. 304                 p = p->link;
  27. 305             }
  28. 306         }
  29. 307     }
  30. 308
  31. 309     return pnew;
  32. 310 }
复制代码
代码中的dblog是在另一个头文件中定义的宏:
  1. 115 #define dblog(fmt, args...) do{     \
  2. 116             printf("[%s:%d]"#fmt"\n", __func__, __LINE__, ##args);  \
  3. 117             }while(0)
复制代码
上面那个函数在.h文件中的定义如下:
  1. 85 /**
  2. 86  * \brief the inter opr, pset_a ^ pset_b
  3. 87  * \param two set struct
  4. 88  */
  5. 89 extern lunar_set_st *lunar_set_inter(lunar_set_st *pset_a,
  6. 90                                         lunar_set_st *pset_b);
  7. 91
复制代码


请问,这里没有浮点数操作,编译环境和运行环境也是相同的,为什么一个宏就会导致出现这种问题?难道是gcc在作怪?





论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-12-18 12:36 |只看该作者
回复 1# joker0910


   
你的程序还真的执行浮点操作了
x86/x64,整数除法会变成浮点除法
若除法结果大于整数范围,会导致浮点异常
除以0则造成除零溢出

论坛徽章:
0
3 [报告]
发表于 2012-12-18 21:48 |只看该作者
回复 2# safedead

恩,下面的头部定义贴错了, 已经改正了。 代码里面没有使用除法啊。还请指点。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP