主题:急 等!!!!!!Fortran计算出现NAN了,怎么让它立刻停止
liuqc
[专家分:0] 发布于 2010-10-12 12:59:00
Fortran计算出现NAN了,怎么让它立刻停止
由于我的计算用的是迭代,所以不太好准确的寻找哪最开始出现NAN,所以我想请问有没有判断的依据让程序计算一旦出现NAN就立马停止 谢谢
回复列表 (共15个回复)
沙发
dongyuanxun [专家分:7180] 发布于 2010-10-12 13:09:00
gfortran和ivf有扩展的判断函数ISNAN(X)
板凳
cgl_lgs [专家分:21040] 发布于 2010-10-12 13:36:00
再配合any
any(ISNAN(MAT))
這樣只要mat數組中一出現nan就會返回.true.
:)
3 楼
jstzhurj [专家分:4680] 发布于 2010-10-12 14:15:00
debug模式运行不行么?
4 楼
liuqc [专家分:0] 发布于 2010-10-12 15:25:00
问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)
5 楼
dongyuanxun [专家分:7180] 发布于 2010-10-12 15:35:00
[quote]
问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)[/quote]
在我这怎么全是显示unicode编码
我翻译一下:
问题解决,谢谢,大家,,,,最后终于发现 出现NAN的原因是计算中没使用REAL(KIND=8),,,(新手,勿嘲!!)
6 楼
yeg001 [专家分:14390] 发布于 2010-10-13 09:01:00
我也是用ISNAN函数作判断, 请问在标准下有没有其他判断NAN的方法?
7 楼
adda [专家分:1520] 发布于 2010-10-14 08:15:00
使用intel fortran的话,使用/fpe0选项,在debug下运行,这样一旦有NaN产生,就会报错并提示错误位置
8 楼
jstzhurj [专家分:4680] 发布于 2010-10-14 08:43:00
[quote]使用intel fortran的话,使用/fpe0选项,在debug下运行,这样一旦有NaN产生,就会报错并提示错误位置[/quote]
学习了,在IDE里面怎么设置呢?
9 楼
f2003 [专家分:7960] 发布于 2010-10-14 09:25:00
给楼主普及一下:
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 楼
jstzhurj [专家分:4680] 发布于 2010-10-14 09:29:00
[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]
深刻!!
我来回复