我想编译一个gfortran程序并启用-O3 -ffast-math
,因为它提供了很好的性能提升。我很困惑,gfortran的isnan()
抓住了一些NaN,但不是全部。阅读是否有可能让isnan()在gfortran -O3 -ffast-math中工作?
Checking if a double (or float) is NaN in C++
how do I make a portable isnan/isinf function
Negative NaN is not a NaN?
后,我的印象是,人们能够通过位摆弄与快速数学甚至启用了C到检查NaN的。然而,这让我为难,因为快速的数学
可能导致不正确的输出依赖于数学函数的具体实现的 IEEE或ISO的规则/规范的程序。
根据gcc 4.7.2的手册页。那么,如果数字不是按照IEEE标准来表示的,那么您怎么知道哪个位需要检查?如果你知道它,你将如何在Fortran 95/03/08中实现它?
不要打扰张贴(x \= x)
或依赖于IEEE规则的模拟解决方案。他们给出了与isnan()
相同的结果。我也知道-ffpe-trap=invalid,zero,overflow
,但不想停止该程序。如果有帮助,我的操作系统是64位LinuxMint 14.如果在Fortran中不可行,防水C解决方案也会很好。
在支持的编译器中可以通过使用适当的内在模块强制编译器遵守IEEE规则。但是,gfortran不支持这一点。你必须忍受快速数学在这方面不安全的事实。 – 2013-04-11 11:18:01
当你打开'快速数学'时,你有希望编译器可以自由假装NaN不存在。这意味着通常产生NaN的计算可能不会,并且编译器可以优化任何检查NaN的代码(因为您承诺它们不存在!),这使得'isnan'本质上是无用的。你的问题相当于晚上蒙着眼睛在弯弯曲曲的山路上超速行驶,并担心你的尾灯失灵。 – 2013-04-18 15:57:01