![](/img/trans.png)
[英]Fortran runtime error: Bad real number in item 1 of list input:Error termination. Backtrace:
[英]fortran error backtrace leads to a where loop
我正在处理大型的fortran代码,并且在使用快速选项进行编译(以便在大型数据库上执行测试)之前,通常会使用“警告”选项进行编译,以便检测并回溯所有问题。
因此,使用gfortran -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -Wall -fcheck=all -ftrapv -g2
编译,我得到以下错误:
Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7fec64cdfef7 in ???
#1 0x7fec64cdf12d in ???
#2 0x7fec6440e4af in ???
#3 0x7fec64a200b4 in ???
#4 0x7fec649dc5ce in ???
#5 0x4cf93a in __f_mod_MOD
at /f_mod.f90:132
#6 0x407d55 in main_loop_
at main.f90:419
#7 0x40cf5c in main_prog
at main.f90:180
#8 0x40d5d3 in main
at main.f90:68
代码f_mod.f90:132的一部分包含一个where循环:
! Compute s parameter
do i = 1, Imax
where (dprim .ne. 1.0)
s(:,:,:, :) = s(:,:,:, :) +vprim(:,:,:, i,:)*dprim(:,:,:, :)*dprim(:,:,:, :)/(1.0 -dprim(:,:,:, :))
endwhere
enddo
但我在这里看不到任何错误。 其他所有位置都是通向该部分的子例程的调用。 当然,由于它是SIGFPE错误,因此我在编译gfortran -g1
时必须在执行时遇到问题。 (我在Linux上使用gfortran 6.4.0)
此外,随着代码完全不同部分的修改,此错误会出现并消失。 因此,问题出在哪里? 还是其他地方的回溯是错误的? 如果是这种情况,我怎么能找到这个错误?
编辑:
由于我无法在一个最小的示例中重现此错误(它们正在工作),因此我认为问题出在其他地方。 但是如何在大代码中查找问题?
由于代码即将死于SIGFPE,请使用每个单独的陷阱来了解它是FE_DIVBYZERO,FE_INVALID,FE_OVERFLOW还是FE_UNDERFLOW。 如果是下溢,则将掩码更改为'1-dprim .ne。 0'。
PS:当可以使用整个数组引用代替时,请不要使用数组节符号。
PPS:您可能要在do循环之外计算dprim * drpim /(1-dprim),因为它是循环不变的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.