|
发表于 2005-6-18 12:44:52
|
显示全部楼层
FORTRAN排错探讨
在linux类型系统下,把浮点fpu的控制字改成遇错就停止,就用下面我编的c语言就可以控制fpu的状态(附件):
/*
A running FORTRAN code may be interrupted for the following cases,
IM: Invalid operation,
ZM: Zero-divide,
OM: Overflow,
DM: Denormalised operand,
UM: Underflow,
PM: Precision (inexact result).
The following code only deals with cases of IM,ZM and OM.
Corresponding changes of the code are needed for other cases.
To use this code, do the following:
1)add "call floating" as the 1st executable statement in your FORTRAN code,
2)"gcc -c -o floating.o floating.c",
3)"g77 FORTRAN_FILE_NAME floating.o -L/usr/i386-glibc21-linux/lib".
That';s it, folks.
Dr. Zhanwen Han, the Yunnan Observatory
zhanwen@public.km.yn.cn
29th-Jan-2001
Revised to fit for glibc2.1 or more by Dr. Xu H.Y., 8th-May-2003
Dr. Huayin Xu, the Yunnan Observatory, xuhuayin@sina.com
*/
#include </usr/include/fpu_control.h>
void __attribute__ ((constructor)) floating_ ()
{
int cwfpu,i;
i=3;
switch(i){
case 1 : cwfpu=_FPU_DEFAULT & ~(_FPU_MASK_OM);
break;
case 2 : cwfpu=_FPU_DEFAULT & ~(_FPU_MASK_ZM | _FPU_MASK_OM);
break;
case 3 : cwfpu=_FPU_DEFAULT & ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM);
break;
case 6 : cwfpu=_FPU_DEFAULT & ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM |
_FPU_MASK_DM | _FPU_MASK_UM | _FPU_MASK_PM);
break;
default: cwfpu=_FPU_DEFAULT;
}
_FPU_SETCW (cwfpu);
}
运行完上面的函数,再用gdb,dbx这样这样的调试器调试运行你的fortran程序,fortran程序停止的地方就是你出错的地方.这种方法可以方便地查上溢,除零,log(-2)的错误.
在windows系统中如何改变fpu字状态我就不大清楚了,不知到visual fortran有没有这样的功能. |
|