2017-04-10 46 views
1

在一個跨平臺的計算器應用程序上工作時,我只注意到在W32上,NaN/Inf值被轉換成字符串的方式不同於OSX/linux。即 。我如何讓printf在w32上使用'nan'?

linux/OSX使用nan rsp inf,而W32使用的東西類似於1.#INF resp。 1.#QNAN

什麼是在所有平臺上獲得相同表示的標準方法?

我想避免手動檢查值isnan()isinf()和硬編碼字符串表示inf resp nan

(我在What is the difference between IND and NAN numbers上看到一些評論,說實際的「罪魁禍首」是libc的實現,而不是平臺)。

+0

只是沒有一個,沒有標準要求double值的* string *表示。甚至沒有正常的雙重價值觀,有時候是一段時間,有時候也是逗號。 MSVC的表現相當不錯,你可以使它更[更有趣](https://blogs.msdn.microsoft.com/oldnewthing/20130228-01/?p=5103):)你必須做到這一點一致你自己。 –

+0

竅門是什麼,你可能也需要相反的 - 改變文本 - 以及它的所有變種 - 成NaN。 – chux

回答

1

在C11(也許更早)中,這些表示是由規範強制的至少部分地。從ISO/IEC 9899:2011,部分7.21.6.1的fprintf功能,第8段:

表示無限遠被轉換中的樣式[-]inf[-]infinity一項的double參數 - 哪種風格是實現定義的。表示爲NaN雙參數被轉換中的樣式[-]nan一個[-]nan(正炭序列) - 哪一種風格,和任何n炭序列的含義,是實現定義的。所述F轉換說明產生分別INFINFINITY,或NAN代替infinfinity,或nan

不僅如此,恐怕你會獨自一人。