我想編譯一個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