Chinaunix
标题:
编译没有问题,运行时报Floating point exception,没有浮点运算。
[打印本页]
作者:
joker0910
时间:
2012-12-17 23:14
标题:
编译没有问题,运行时报Floating point exception,没有浮点运算。
本帖最后由 joker0910 于 2012-12-18 21:45 编辑
Linux ubuntu 2.6.32-40-generic #87-Ubuntu SMP Mon Mar 5 20:26:31 UTC 2012 i686 GNU/Linux
Using built-in specs.
Target: i486-linux-gnu
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
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
复制代码
这是我的运行/编译环境。 编译如下代码之后, 在本机执行, 立刻在终端上打印"Floating point exception"
279 lunar_set_st *lunar_set_inter(lunar_set_st *pset_a, lunar_set_st *pset_b)
280 {
281 lunar_set_st *pnew = NULL;
282
283 if(pset_a == NULL) {
284 pnew = lunar_set_new(pset_b->size, pset_b->cmp, pset_b->hash);
285 } else if(pset_b == NULL) {
286 pnew = lunar_set_new(pset_a->size, pset_a->cmp, pset_b->hash);
287 } else if(pset_b->length < pset_a->length) {
288 return lunar_set_inter(pset_b, pset_a);
289 } else {
290 pnew = lunar_set_new(ARITH_MIN(pset_a->size, pset_b->size),
291 pset_a->cmp, pset_a->hash);
292 if(pnew == NULL) {
293 // dblog("get new set failed!"); /* 这句如果注释掉,那么程序正常, 如果没有注释掉,就会在执行时,报Floating point exception */
294 return NULL;
295 }
296 struct member *p = NULL;
297 int i = 0;
298 for(i = 0; i < pset_a->size; i++) {
299 p = pset_a->buckets[i];
300 while(p) {
301 if(lunar_set_member(pset_b, p->member)){
302 lunar_set_put(pnew, p->member);
303 }
304 p = p->link;
305 }
306 }
307 }
308
309 return pnew;
310 }
复制代码
代码中的dblog是在另一个头文件中定义的宏:
115 #define dblog(fmt, args...) do{ \
116 printf("[%s:%d]"#fmt"\n", __func__, __LINE__, ##args); \
117 }while(0)
复制代码
上面那个函数在.h文件中的定义如下:
85 /**
86 * \brief the inter opr, pset_a ^ pset_b
87 * \param two set struct
88 */
89 extern lunar_set_st *lunar_set_inter(lunar_set_st *pset_a,
90 lunar_set_st *pset_b);
91
复制代码
请问,这里没有浮点数操作,编译环境和运行环境也是相同的,为什么一个宏就会导致出现这种问题?难道是gcc在作怪?
作者:
safedead
时间:
2012-12-18 12:36
回复
1#
joker0910
你的程序还真的执行浮点操作了
x86/x64,整数除法会变成浮点除法
若除法结果大于整数范围,会导致浮点异常
除以0则造成除零溢出
作者:
joker0910
时间:
2012-12-18 21:48
回复
2#
safedead
恩,下面的头部定义贴错了, 已经改正了。 代码里面没有使用除法啊。还请指点。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2