2013-06-30 54 views
3

我想寫一個函數,檢查float,doublelong double完全符合IEEE-754格式。我的意思是:返回浮點類型是否完全符合IEEE-754的函數?

我認爲std::numeric_limits<T>::is_iec559是對應於,但它long double在我的Linux 64返回true bits其中sizeof(long double) = 16 bytes但內部編碼在80-bit英特爾格式。那麼該怎麼做?

+3

80位英特爾格式**是符合IEEE-754格式的格式(具體來說,它滿足第3.7節中定義的「binary64擴展」格式的要求)。我想你想要一個謂詞來指定一個格式是否是IEEE-754「基本格式」(或可能是「交換格式」);這比'is_iec559'聲稱表示的更具體的要求。 –

+0

由於內存對齊的要求,我經常在x86_32上看到'sizeof(long double)'爲12個字節,在x86_64 GNU G ++上看到16個字節。 –

回答

1

如果std::numeric_limits<T>::is_iec559爲真,則T符合標準。

如果系統爲其內部寄存器使用80位,只要最後的舍入結果與使用無限位數的參考結果最接近即可。也就是說,添加或刪除一個ulp會使您遠離參考。

通過對所有可表示的數字運行所有可能的操作並與使用許多位的引用進行比較,很難對此進行檢查。

您需要對std::numeric_limits和實現它的庫有信心。