我想測試我的目標板下面的事情:如何檢查使用IEEE 754單精度(32位)浮點表示法?
- 與IEEE 754單精度(32位)實現「浮動」浮點變量?
- 使用IEEE 754雙精度(64位)浮點變量實現'double'嗎?
什麼是我可以用一個簡單的C程序測試它的方式。
我想測試我的目標板下面的事情:如何檢查使用IEEE 754單精度(32位)浮點表示法?
什麼是我可以用一個簡單的C程序測試它的方式。
不存在簡單測試。
當今絕大多數系統使用IEEE-754格式進行浮點運算。但是,大多數C實現並不完全符合IEEE 754(與IEC 60559相同),也沒有設置預處理器標識符__STDC_IEC_559__
。在沒有此標識符的情況下,確定C實現是否符合IEEE 754的唯一方法是以下一種或其組合:
在許多C實現和軟件應用程序中,與IEEE 754的偏差可以忽略或解決:您可以編寫代碼,就好像IEEE 754正在使用中一樣,並且很多代碼將在很大程度上工作。然而,有許多事情可能會讓一個毫無戒心的程序員絆倒;即使遵循完整的規範,編寫完全正確的浮點代碼也很困難。
常見的偏差包括:
double
值的表達式可以用long double
精度計算。sqrt
在每種情況下都不會返回正確的舍入值。3.1415926535897932384626433
在源代碼中)之間二進制浮點格式(例如,普通的double
格式,IEEE-754 64位二進制)在任一轉換方向上都不會總是正確地舍入。cos
,log
等)很少支持其他舍入模式。我的系統不符合我發現的標準。如你所說,只有詳盡的測試纔是確鑿的。另外我的系統實現了一些功能,並沒有其他的功能。 – user3171859
你有更多的細節:「sqrt在每種情況下都不會返回正確的四捨五入的值。」「? –
在C99,你可以檢查__STDC_IEC_559__
:
#ifdef __STDC_IEC_559__
/* using IEEE-754 */
#endif
這是因爲由C99引用的國際浮點標準是IEC 60559:989(IEC 559和IEEE-754是前面的描述)。從C語言到IEC 60559的映射是可選的,但如果在使用中,實現定義宏__STDC_IEC_559__
(C99標準的附錄F),所以您完全可以依賴它。
另一種選擇是如果值手動檢查在float.h
,如FLT_MAX
,FLT_EPSILON
,FLT_MAX_10_EXP
等,匹配與IEEE-754的限制,雖然理論上有可能是具有相同的值的另一表示。
#ifdef返回爲false可以從中推斷出任何東西嗎? – user3171859
@ user3171859是的,這意味着實現不使用IEEE-754浮點數。否則,需要定義該宏 –
C標準不要求符合IEEE 754的實現(如附件F中的史詩字段)定義'__STDC_IEC_559__'。它要求定義'__STDC_IEC_559__'的實現符合IEEE 754. –
首先,你可以找到有關ISO/IEC/IEEE 60559詳情(或IEEE 754)在維基百科:
正如F. Goncalvez告訴你,宏__STDC_IEC_559__
爲您帶來有關您的編譯器的信息,如果它符合IEEE 754或不符合。
在下文中,我們
但是,您可以獲取與宏FLT_EVAL_METHOD
的附加信息。
該宏的值是指:
0的所有操作和常量中使用的類型的範圍和精度進行了評價。
1的類型float
和double
的操作範圍和精度double
評估,並long double
去以自己的方式...
2所有類型的評價爲在精度和完成範圍爲long double
。
-1不確定
其它負值:實現定義(這取決於你的編譯器)。
例如,如果FLT_EVAL_METHOD == 2
,和你持有數計算的結果浮點變量x
,那麼所有的操作和常量計算或者最好precition處理,也就是long double
,但只有最終結果四捨五入爲x
所具有的類型。
這種行爲減少了數字錯誤的缺陷。
爲了解浮點類型的細節,您必須觀察標準標頭<float.h>
提供的常量宏。
例如,看到這個鏈接:
Çharacteristics of floating point types
在悲傷的情況下,你的實現不符合IEEE 754標準,你可以嘗試在標準頭<float.h>
尋找細節,如果它存在。
此外,你必須閱讀你的編譯器的文檔。
例如,編譯器GCC解釋了浮點哪些呢:
我認爲FLT_EVAL_METHOD只適用於float_f和double_f而不是float和double。還有:N1256 7.12/2和http://stackoverflow.com/questions/5390011/whats-the-point-of-float-t-and-when-should-it-be-used –
True!與C99相同,謝謝。 –
見PARANOIA:http://people.sc.fsu.edu/~%20jburkardt/c_src/paranoia/paranoia。 c –
我認爲你有問題。它是這個詞*簡單* – UmNyobe
我已經看到偏執狂,但我需要更簡單的東西,因爲代碼不能在我的平臺上編譯運行freertos.Half我的時間將浪費在移植。請更簡單的東西。 – user3171859