我正在為基本型別撰寫類,因此代碼在多個平臺和編譯器(如int_least16_tfor int)上在邏輯上是相同的。為了娛樂!(我還是個學生。)我讀到這個:
float [...] 匹配 IEEE-754 binary32 格式(如果支持)。
更糟糕的是:
浮點型別可以支持特殊值: ∞、NaN 或 -0
這意味著浮動可能是無符號的......
我知道就像__int128一樣,標準只是一個標準,但仍然...... IEEE-754 是從 1985 年開始的,但有些機器可能很奇怪,有些舊硬體沒有浮動單元。
據我了解,float 是強制性的(不像 int16_t 那樣是可選的),但可以是任何標準,并且任何一組值都是可能的?
我們只有一些宏(<cfloat>):
FLT_MIN,FLT_MAX- 即使FLT_MIN = IEEE-754::FLT_MIN, float 也可以是非 IEEE-754。例如 float with:flipped exponent with fraction ...FLT_RADIX- 基礎系統?如果是這樣,可以幫助寫出確切的值。但是,浮點數仍然可以是 3 位或 200 位(大小)...FLT_EPSILON- (從 1 到下一個)我們可能會使用它(帶基數)來檢查分數大小...FLT_MANT_DIG- 它是“尾數”數字/分數大小嗎?FLT_MAX_EXP- 在 IEEE-754 中用 1... 填充的指數,但外??面可以是亂數嗎?
如果 float 類似于 IEEE-754(符號、指數、分數),那么它很容易,但如果 -0 和 NaN 是可選的,那么它可能會有所不同。因為我無法區分它們,所以我不能使用位表示(以安全的方式)。如果∞是可選的,float則不再是安全型別。
我看到的唯一方法是將宏添加到編譯器。
float我知道這是一個理論上的問題,但是當我們使用關鍵字時,如果有任何可能的檢查或者我們都撰寫依賴于實作的代碼,我很感興趣?
uj5u.com熱心網友回復:
在 C 中,std::numeric_limits<T>::is_iec559應true為所有浮點型別的值T “當且僅當該型別符合 ISO/IEC/IEEE 60559”且 ISO/IEC/IEEE 60559:2011 與 IEEE 754-2008 相同,所以:
#include <iostream>
#include <limits>
int main() {
std::cout << std::boolalpha << std::numeric_limits<float>::is_iec559 << '\n';
}
注意:如評論中所述,某些實作可能仍會報告true此常量,即使它們的浮點型別不符合 IEEE 754-2008 標準。
例如,在 中gcc,您可以使用選項進行編譯,-Ofast或者-ffast-math反過來設定許多選項,這些選項可能導致依賴于數學函式的 IEEE 或 ISO 規則/規范的精確實作的程式的錯誤輸出。
在C99(及更高版本)中,有條件功能宏,__STDC_IEC_559__并且__STDC_IEC_559_COMPLEX__,如果在您的實作中可用,它將告訴您它是否符合 IEC 60559:1989 / IEEE 754?1985。
#include <stdio.h>
int main(void) {
#ifdef __STDC_IEC_559__
puts("true");
#endif
}
請注意,如果__STDC_IEC_559__未定義,并不一定意味著實作不使用 IEEE 754 浮點數。這可能只是意味著它沒有這些條件功能宏。關于這些宏的一個有趣的注意事項是,如果您使用-Ofastor -ffast-mathin gcc,它們將不會被定義(與 C 測驗中不同)。
在C11和C17/18和C23 (草案)中使用的 IEC / IEEE 標準的實際修訂將有許多與浮點相關的新宏,它(當前)指的是 ISO/IEC 60559:2020 和 IEEE 754-2019 包含對 IEC 60559:2011 / IEEE 754-2008 的小幅升級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467418.html
