2017-04-10 32 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

不仅如此,恐怕你会独自一人。