2014-01-28 92 views
5

我想測試我的目標板下面的事情:如何檢查使用IEEE 754單精度(32位)浮點表示法?

  • 與IEEE 754單精度(32位)實現「浮動」浮點變量?
  • 使用IEEE 754雙精度(64位)浮點變量實現'double'嗎?

什麼是我可以用一個簡單的C程序測試它的方式。

+0

見PARANOIA:http://people.sc.fsu.edu/~%20jburkardt/c_src/paranoia/paranoia。 c –

+0

我認爲你有問題。它是這個詞*簡單* – UmNyobe

+0

我已經看到偏執狂,但我需要更簡單的東西,因爲代碼不能在我的平臺上編譯運行freertos.Half我的時間將浪費在移植。請更簡單的東西。 – user3171859

回答

6

不存在簡單測試。

當今絕大多數系統使用IEEE-754格式進行浮點運算。但是,大多數C實現並不完全符合IEEE 754(與IEC 60559相同),也沒有設置預處理器標識符__STDC_IEC_559__。在沒有此標識符的情況下,確定C實現是否符合IEEE 754的唯一方法是以下一種或其組合:

  • 請閱讀其文檔。
  • 檢查它的源代碼。
  • 測試它(當然,當只有詳盡的測試可能是確鑿的時候,這當然是困難的)。

在許多C實現和軟件應用程序中,與IEEE 754的偏差可以忽略或解決:您可以編寫代碼,就好像IEEE 754正在使用中一樣,並且很多代碼將在很大程度上工作。然而,有許多事情可能會讓一個毫無戒心的程序員絆倒;即使遵循完整的規範,編寫完全正確的浮點代碼也很困難。

常見的偏差包括:

  • 中間體算術與比標稱類型更精確執行。例如,使用double值的表達式可以用long double精度計算。
  • sqrt在每種情況下都不會返回正確的舍入值。
  • 其他數學庫例程返回的值可能與正確舍入的結果稍有偏離(幾個ULP)。 (實際上,沒有人實現了IEEE 754-2008中推薦的所有數學例程,保證了正確的舍入和保證的運行時間。)
  • 次正規數(靠近浮點格式的邊緣微小的數字)可被轉換到零,而不是處理由IEEE 754指定
  • 換算十進制數(例如,3.1415926535897932384626433在源代碼中)之間二進制浮點格式(例如,普通的double格式,IEEE-754 64位二進制)在任一轉換方向上都不會總是正確地舍入。
  • 僅支持圓整模式;不支持IEEE 754中指定的其他舍入模式。或者它們可能適用於簡單的算術運算,但需要使用機器特定的彙編語言才能訪問。標準數學庫(cos,log等)很少支持其他舍入模式。
+0

我的系統不符合我發現的標準。如你所說,只有詳盡的測試纔是確鑿的。另外我的系統實現了一些功能,並沒有其他的功能。 – user3171859

+0

你有更多的細節:「sqrt在每種情況下都不會返回正確的四捨五入的值。」「? –

3

在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_MAXFLT_EPSILONFLT_MAX_10_EXP等,匹配與IEEE-754的限制,雖然理論上有可能是具有相同的值的另一表示。

+0

#ifdef返回爲false可以從中推斷出任何東西嗎? – user3171859

+0

@ user3171859是的,這意味着實現不使用IEEE-754浮點數。否則,需要定義該宏 –

+4

C標準不要求符合IEEE 754的實現(如附件F中的史詩字段)定義'__STDC_IEC_559__'。它要求定義'__STDC_IEC_559__'的實現符合IEEE 754. –

3

首先,你可以找到有關ISO/IEC/IEEE 60559詳情(或IEEE 754)在維基百科:

Floating point standard types

正如F. Goncalvez告訴你,宏__STDC_IEC_559__爲您帶來有關您的編譯器的信息,如果它符合IEEE 754或不符合。

在下文中,我們

但是,您可以獲取與宏FLT_EVAL_METHOD的附加信息。

該宏的值是指:

  • 0的所有操作和常量中使用的類型的範圍和精度進行了評價。

  • 1的類型floatdouble的操作範圍和精度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解釋了浮點哪些呢:

Stadus of C99 features in GCC

+0

我認爲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 –

+0

True!與C99相同,謝謝。 –

相關問題