【问题标题】:Is it safe to assume that float or double NaNs will always be "nan" as a string?假设 float 或 double NaN 将始终是“nan”作为字符串是否安全?
【发布时间】:2019-06-18 10:00:22
【问题描述】:

如果我通过 std::cout 打印 NaN 或将其转换为字符串,标准是否说它必须是“nan”作为字符串?

是否有其他方法可以将 NaN 转换为字符串,但事实并非如此?

#include <iostream>
#include <limits>

int main() {    

    float x = std::numeric_limits<float>::quiet_NaN();
    std::cout << x << '\n';                 // Output: nan
    std::cout << std::to_string(x) << '\n'; // Output: nan
    printf("%f", x);                        // Output: nan

    // possibly other variants to print x
}

【问题讨论】:

  • 没有。在 Windows/VC++ 中它看起来不同。 (不幸的是,我忘记了。)但是,我找到了这个 Q/A:SO: NaN ASCII I/O with Visual C++。 (它显示了我大致记得的内容。)
  • 找到与@foreknownas_463035818 相同的链接。在 VC++ 中如何完成事情可能是一个错误。不幸的是,相应的。 Hans Passant 的链接已经烂了。
  • 我还询问了 std::to_string 以外的其他变体,所以不完全是重复的。
  • 我认为this answer 涵盖了使用cout (即使问题是专门关于Visual C++,我认为答案的范围更广)
  • 这让我抓狂微软决定在其 Connect 平台上立即中断所有指向错误报告的链接,绝对没有重定向,也没有任何指示如何找到移动的内容.在我看来,这确实说明了那里的文化。

标签: c++ floating-point nan


【解决方案1】:

std::to_string 是根据std::sprintf 定义的,C++ 采用了 C99 标准库。上面写着:

非数字转换为nannan(char_sequence)。使用哪一个由实现定义。

所以字符串将以nan开头,但后面可能还有其他字符。

不幸的是,Microsoft 的库似乎不兼容。看到这个答案:

https://stackoverflow.com/a/7478290/856199

因此,在考虑了所有这些之后,最终结果是您的 C 标准库不符合 C99,因为根据上述,1.#QNAN 不是 fprintf 的有效输出。但是,众所周知,Microsoft 的 C 运行时不兼容 C99,据我所知,它不打算很快兼容。


(离题)
不要使用std::endl,除非你真的想要一个简短的'\n' &lt;&lt; std::flush

【讨论】:

  • 所以 Visual C++ 不符合 stackoverflow.com/questions/7477978/nan-ascii-i-o-with-visual-c 的标准,它将 nan 打印为“1.#QNAN”?
  • @nada 没错,亚当对您所链接的问题的回答确实说明了这一点(探索了原因)
  • 如果讨论过std::cout &lt;&lt; x &lt;&lt; std::endl,则答案将是完整的。
  • @Bathsheba 够公平的:-)
【解决方案2】:

添加到@Nikos C.:

std::cout 是 std::basic_ostream 导致 std::num_put 关于格式的说明

如果v的类型是浮点类型,第一个适用 选择以下选项:

If floatfield == std::ios_base::fixed, will use conversion specifier %f 
If floatfield == std::ios_base::scientific && !uppercase, will use conversion specifier %e 
If floatfield == std::ios_base::scientific, will use conversion specifier %E

所以我要得出结论,std::cout 也与 printf 相关

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2013-11-26
    • 2014-01-03
    • 2011-07-23
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多