3 回答
TA貢獻1836條經驗 獲得超13個贊
根據ieee標準,nan值具有奇怪的屬性,涉及它們的比較是總假的。也就是說,對于浮子f來說,f != f會是真的只如果f是南。
注意,正如下面的一些注釋所指出的,并非所有編譯器在優化代碼時都尊重這一點。
對于任何聲稱使用ieee浮點的編譯器,此技巧應工作。但我不能保證將要在實踐中工作
TA貢獻2021條經驗 獲得超8個贊
沒有isnan()函數在當前的C+標準庫中可用。它是在C99定義為宏不是函數。由C99定義的標準庫元素不屬于當前的C+標準ISO/IEC 14882:1998,也不是其更新的ISO/IEC 14882:2003。
2005年提出了“技術報告1”。TR1與C99和C+兼容。盡管它從未被正式采用成為C+標準,但許多GCC 4.0+或Visual C+9.0+C+實現確實提供了TR1功能,所有這些特性或只有一些特性(VisualC+9.0不提供C99數學函數)。
如果TR1可用,那么cmath包括C99元素,如isnan(),?isfinite()等等,但它們被定義為函數,而不是宏,通常在std::tr1::命名空間,盡管許多實現(即Linux上的GCC 4+或MacOSX10.5+上的XCode)將它們直接注入到std::,所以std::isnan定義得很清楚。
此外,C+的一些實現仍然使C99isnan()可用于C+的宏(包括cmath或math.h),什么會引起更多的混亂,開發人員可能會認為這是一種標準行為。
如上文所述,關于VIZE C+的說明沒有提供std::isnan兩樣std::tr1::isnan,但是它提供了一個定義為_isnan()從那時起就有了Visual C+6.0
在XCode上,還有更多的樂趣。如前所述,GCC 4+定義了std::isnan..對于較早版本的編譯器和庫表單XCode,似乎(這里是相關討論),還沒有機會檢查我自己)定義了兩個函數,__inline_isnand()關于英特爾和__isnand()在電源PC上。
- 3 回答
- 0 關注
- 1580 瀏覽
添加回答
舉報
