回 帖 发 新 帖 刷新版面

主题:急 等!!!!!!Fortran计算出现NAN了,怎么让它立刻停止

Fortran计算出现NAN了,怎么让它立刻停止 
  由于我的计算用的是迭代,所以不太好准确的寻找哪最开始出现NAN,所以我想请问有没有判断的依据让程序计算一旦出现NAN就立马停止  谢谢

回复列表 (共15个回复)

沙发

gfortran和ivf有扩展的判断函数ISNAN(X)

板凳

再配合any
any(ISNAN(MAT))
這樣只要mat數組中一出現nan就會返回.true.
:)

3 楼


debug模式运行不行么?

4 楼


问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)

5 楼

[quote]
问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)[/quote]
在我这怎么全是显示unicode编码

我翻译一下:
问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)

6 楼

我也是用ISNAN函数作判断, 请问在标准下有没有其他判断NAN的方法?

7 楼

使用intel fortran的话,使用/fpe0选项,在debug下运行,这样一旦有NaN产生,就会报错并提示错误位置

8 楼

[quote]使用intel fortran的话,使用/fpe0选项,在debug下运行,这样一旦有NaN产生,就会报错并提示错误位置[/quote]

学习了,在IDE里面怎么设置呢?

9 楼

给楼主普及一下:

0)nan, inf, 这些也是ieee浮点数,ieee754给出了它们的二进制表示,并且定义了它们的计算。nan跟1.0没有区别,比如 1.0+nan = nan, 1.0/inf = 0.0等等,
   Fortran是面向数值计算的语言,所以fortran2003加入了支持ieee754各种操作的设施。除了不能自定义浮点异常的中断程序之外(太底层了),Fortran2003完全支持了ieee754-2008.

1)isNaN是非标准的,不过很多编译器都有这个函数。将来应该使用ieee_isNan,

2)根据ieee754-2008,nan分为quiet NaN与signal NaN, 在程序中分别使用,可以控制出现nan时程序是否中断。

3)谈一谈“有效运行原则”,
   为什么出现了nan程序就必须中断?完全没有那个必要。
   老编译器都是出现了nan就中断,这也许是你期望的,但将来编译器会越来越多的让程序尽量计算下去,
   你按下电钮火箭升空,这时候程序中产生了nan,你是希望它带着缺陷尽量运行,回头解决问题,还是立刻中断运行,让火箭掉下来,解决问题后再发射?
   你的人工心脏的程序出现了浮点异常,是尽量运行,还是立刻停止修复后再启动?如果那样,病人的生命可能丧失。
   这是为了挽救一种幸运的情形, 出现nan的地方可能只是显示结果之类的次要的地方,不是"要命"的部分. 
   即使计算结果是垃圾,也尽量让程序活着,这个观点会成为主流的。所以,你的程序出现了nan却没有中断运行,某种意义上正是因为编译器比较现代。
   
4)过几年,如果你还认为出现了nan就必须中断程序,你是笨蛋。
   聪明的方式是,程序里有处理出现了nan的代码,也就是类似
   if(isNan(x)) then

  ISO TR 15580 IEEE Arithmetic,这其实是Fortran2003最重要的特性。除了gfortran还没有实现,几乎所有的编译器都已经支持了,大家应该花点时间玩玩。
  http://fortranwiki.org/fortran/show/Fortran+2003+status
  顺便地,最近看到一个帖子,说ibm的 xlf 13.1已经“完全实现的fortran2003',

10 楼

[quote]给楼主普及一下:

0)nan, inf, 这些也是ieee浮点数,ieee754给出了它们的二进制表示,并且定义了它们的计算。nan跟1.0没有区别,比如 1.0+nan = nan, 1.0/inf = 0.0等等,
   Fortran是面向数值计算的语言,所以fortran2003加入了支持ieee754各种操作的设施。除了不能自定义浮点异常的中断程序之外(太底层了),Fortran2003完全支持了ieee754-2008.

1)isNaN是非标准的,不过很多编译器都有这个函数。将来应该使用ieee_isNan,

2)根据ieee754-2008,nan分为silent NaN与signal NaN, 在程序中分别使用,可以控制出现nan时程序是否中断。

3)谈一谈“有效运行原则”,
   为什么出现了nan程序就必须中断?完全没有那个必要。
   老编译器都是出现了nan就中断,这也许是你期望的,但将来编译器会越来越多的让程序尽量计算下去,
   你按下电钮火箭升空,这时候程序中产生了nan,你是希望它带着缺陷尽量运行,回头解决问题,还是立刻中断运行,让火箭掉下来,解决问题后再发射?
   你的人工心脏的程序出现了浮点异常,是尽量运行,还是立刻停止修复后再启动?如果那样,病人的生命可能丧失。
   这是趋势,所以,你的程序出现了nan却没有中断运行,某种意义上正是因为编译器比较现代,它尽量让你的程序运行下去。
   
4)过几年,如果你还认为出现了nan就必须中断程序,你是笨蛋。
   聪明的方式是,程序里有处理出现了nan的代码,也就是类似
   if(isNan(x)) then[/quote]
深刻!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册